Передача данных между Activity

В android приложении передать данные между двумя разным Activity — часто встречаемая задача. Я опущу приведение примеров таких ситуаций потому, что это не имеет смысла, вместо этого перейдем прямо к сути.

Для перехода между Activity используется класс Intent. Посмотрим на следующий код:

Intent intent = new Intent(this, MySuperActivity.class);
startActivity(intent);

Всего пара строк и мы наблюдаем нашу MySuperActivity во все красе. Давайте посмотрим на практике. Я создам новый проект в котором будут две ActivityMainActivity и DaSupaActivity. Приводить листинг их XML разметки нет смысла, т.к. на первой только одна Button, а на второй только TextView. И, о богомерзкий ужас, я там даже на хардкодил hardcoded ?

Немного кода в MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button myButton = findViewById(R.id.button);
    myButton.setOnClickListener((v)->{
        Intent i = new Intent(this, DaSupaActivity.class);
        startActivity(i);
    });
}

Больше пока ничего не меняем, и вот что у нас получилось:

А теперь давайте что-нибудь передадим второй Activity. Для этого у класса Intent есть метод putExtra(). Вот он:

Список перегрузок метода putExtra()

Не будем сильно хитрить и добавим еще одну строку в метод onCreate() у MainActivity

...
Intent i = new Intent(this, DaSupaActivity.class);
i.putExtra("Greeting", "Hello darlin'");
startActivity(i);
...

И примем эту красоту на DaSupaActivity. Вот вам полностью листинг метода onCreate()

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_da_supa);

        TextView v = findViewById(R.id.textView);

        Intent i = getIntent();
        String s = i.getExtras().get("Greeting").toString();

        v.setText(s);

    }

И полюбуемся что мы начудили…

Cool! Как мы уже видели у метода много перегрузок, и мы можем передавать все что захотим… или нет ? как видно из скриншота выше, в перегрузках метода putExtra() только примитивные типы и какие-то Parcelable и Serializable.

В случае с android.os.Parcelable — это интерфейс разработанный как замена «деревянному» Serializable. Реализация передачи сложных объектов с его помощью Parcelable сложнее т.к. нам фактически самостоятельно приходится описывать способ парсинга полей класса, в то время как Serializable проще но использует Java Reflection что намного медленней (в прочим медленней — понятие растяжимое) и какой способ использовать вам, исключительно ваше дело. Вот кстати интересная статейка

Посмотрим на картинку, сделаем выводы, и закончим на этом лирику. Приступим к реализации. Я лентяй, буду делать через Serializable. Создадим POJO класс Greeting

package ru.bolotnikoff.mytestingapp;

import java.io.Serializable;

public class Greeting implements Serializable {
    public String greetingType;
    public String greetingObject;
}

Ну и следом все остальные листинги

package ru.bolotnikoff.mytestingapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Greeting greeting = new Greeting();
        greeting.greetingType = "Aloha";
        greeting.greetingObject = "kuʻu hoa";

        Button myButton = findViewById(R.id.button);
        myButton.setOnClickListener((v)->{
            Intent i = new Intent(this, DaSupaActivity.class);
            i.putExtra("Greeting", greeting);
            startActivity(i);
        });
    }
}

Разметка MySuperActivity

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DaSupaActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:fontFamily="sans-serif-condensed"
        android:text="qwertyuio"
        android:textColor="@color/colorAccent"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.479" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:fontFamily="sans-serif-condensed"
        android:text="qwertyuio"
        android:textColor="@color/colorAccent"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.54" />

</android.support.constraint.ConstraintLayout>

И сама MySuperActivity

package ru.bolotnikoff.mytestingapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class DaSupaActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_da_supa);

        TextView v1 = findViewById(R.id.textView);
        TextView v2 = findViewById(R.id.textView2);

        Bundle extras = getIntent().getExtras();
        Greeting greeting = null;
        if (extras != null) greeting = (Greeting) extras.getSerializable("Greeting");

        if (greeting != null) {
            v1.setText(greeting.greetingType);
            v2.setText(greeting.greetingObject);
        }
    }
}

Посмотрим на итог:

Итак, мы рассмотрели способы передачи данных в Activity, и даже увидели что есть способы передачи сложных объектов. Справедливости ради, надо заметить что существует метод putExtra(String name, Parcelable[] value) принимающий массив Parcelable[], который уж действительно может проявить себя во всей красе, если вы передаете довольно много объектов.

Поделиться этим материалом