Przesyłanie danych między Aktywnościami w Androidzie
W poprzednim artykule na temat programowania w Androidzie, opisywałem co to są Aktywności, jaki jest ich cykl życia oraz jak je uruchomić. Część z was, podczas lektury poprzedniego postu pewnie pomyślała sobie, „ok, ale jak przesłać między tymi oknami dane?” jeśli tak to właśnie ten dylemat rozwiążemy w tym artykule. A więc do dzieła!

Fot: mammela, CC0 Public Domain.
Założeniem projektantów systemu Android jest to, aby każda aplikacja składała się z różnych niezależnych od siebie okien. W tym celu programistom został więc udostępniony mechanizm Aktywności. Jednak, należy pamiętać o tym, że choć każde okno jest oddzielne to dane wprowadzone w jednym mogą być potrzebne w drugim. Jest to rzecz tak naturalna, że specjalnie do tego został zaprojektowany odpowiedni mechanizm służący właśnie do przekazywania między aktywnościami różnych obiektów.
Jak to wszystko się odbywa?
A więc tak, stanem wyjściowym będzie nowy projekt stworzony w artykule „pierwsza aplikacja w Android Studio„. Jego struktura prezentuje się tak:

Na samym początku w layoucie activity_main.xml musimy dodać przycisk, który po kliknięciu będzie uruchamiał drugą aktywność. Przeciągamy więc z toolboxa odpowiednią kontrolkę i zmieniamy zawartość przyciska na tekst „Nowa aktywność„:

Następnie w pliku MainActivity.java tworzymy nową metodę o nazwie nextStep(View view). Jej kod wygląda następująco:
public void nextStep(View view) {
}
Teraz z powrotem przechodzimy do activity_main.xml i po kliknięciu w buttona w prawej kolumnie „Properties” (pl. właściwości) odszukujemy pozycji o nazwie onClick i z listy wybieramy nowo dodaną metodę:

Kod naszego buttonu wygląda tak (można go wkleić do pliku z layoutem):
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="197dp"
android:id="@+id/button"
tools:text="Nowa aktywność"
android:onClick="nextStep" />
Ok, teraz zgodnie z instrukcjami z artykułu „Aktywności w Androidzie” dodajemy do projektu nową aktywność o nazwie „SecondActivity„. Jako typ aktywności wybieramy na przykład „Blank Activity„.
Wracamy do metody nextStep() i wpisujemy tam kod, który uruchomi drugą aktywność czyli SecondActivity (szczegóły omawiane były w artykule „Aktywności w Androidzie„). Kod naszej metody wygląda więc następująco:
public void nextStep(View view) {
Intent i = new Intent(this, SecondActivity.class);
startActivity(i);
}
Teraz możemy uruchomić nasz projekt, i po kliknięciu w przycisk „Nowa aktywność” zostaniemy przeniesieni do nowego okna. Zbierzmy się więc za przekazywanie danych.
putExtra() co to takiego?
Tworząc obiekt typu Intent mamy publicznie dostępną metodę o nazwie putExtra(). Jest to metoda, która umożliwia nam przesyłanie danych z jednej aktywności do drugiej. Załóżmy, że w MainActivity wczytujemy jakieś tam informacje podane przez użytkownika – na potrzeby tego przykładu nie ma znaczenia w jaki sposób to robimy więc załóżmy, że wszystkie potrzebne dane mamy zapisane w polu typu String o nazwie name. Pole to jest publicznie dostępne w klasie MainActivity.
Nasz dotychczasowy kod:
public class MainActivity extends Activity {
public String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = "Łukasz Dudziński";
}
public void nextStep(View view) {
Intent i = new Intent(this, SecondActivity.class);
startActivity(i);
}
}
Teraz chcemy dane zapisane w polu name przesłać do drugiej aktywności o nazwie SecondActivity. Wykorzystamy do tego omówioną wyżej metodę:
i.putExtra("name", name);
W ten właśnie sposób dodajemy do nowego Intentu dane, które będziemy mogli odczytać w drugiej aktywności.
Jak pewnie zauważyliście metoda putExtra() przyjmuje dwa argumenty, pierwszy typu String to unikalna nazwa danych, które przesyłamy, a drugi to przesyłany obiekt.
Uwaga: Nie każdy obiekt możemy w ten sposób przesłać do drugiej aktywności. Dozwolone są następujące typy obiektów:
putExtra(String name, Parcelable value);putExtra(String name, long[] value);putExtra(String name, byte value);putExtra(String name, double[] value);putExtra(String name, CharSequence value);putExtra(String name, boolean[] value);putExtra(String name, int value);putExtra(String name, char[] value);putExtra(String name, byte[] value);putExtra(String name, Parcelable[] value);putExtra(String name, Bundle value);putExtra(String name, CharSequence[] value);putExtra(String name, float[] value);putExtra(String name, double value);putExtra(String name, int[] value);putExtra(String name, String[] value);putExtra(String name, short[] value);putExtra(String name, boolean value);putExtra(String name, String value);putExtra(String name, long value);putExtra(String name, char value);putExtra(String name, Serializable value);putExtra(String name, float value);putExtra(String name, short value);
Cały kod metody nextStep():
public void nextStep(View view) {
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("name", name);
startActivity(i);
}
Odczyt danych
Kiedy już uruchomimy drugą aktywność pasowało by odczytać wszystkie przesłane dane. Aby to zrobić musimy skorzystać z odpowiedniej metody obiektu Intent – oczywiście wcześniej pobierając odpowiedniego Intenta oraz jako argument podać unikalną nazwę naszych danych podaną przy zapisywaniu ich.
Dla Stringa będzie to wyglądało tak:
getIntent().getStringExtra("name");
Gdzie jako argument metody getStringExtra() podaliśmy unikalną nazwę naszych danych zapisaną w poprzednim Intencie (w metodzie putExtra()).
Uwaga: Każdy typ obiektu odczytujemy inną metodą:
boolean |
getBooleanArrayExtra(String name); |
Bundle |
getBundleExtra(String name); |
byte[] |
getByteArrayExtra(String name); |
byte |
getByteExtra(String name, byte defaultValue); |
char[] |
getCharArrayExtra(String name); |
char |
getCharExtra(String name, char defaultValue); |
CharSequence[] |
getCharSequenceArrayExtra(String name); |
ArrayList<CharSequence> |
getCharSequenceArrayListExtra(String name); |
CharSequence |
getCharSequenceExtra(String name); |
double[] |
getDoubleArrayExtra(String name); |
double |
getDoubleExtra(String name, double defaultValue); |
Bundle |
getExtras(); |
float[] |
getFloatArrayExtra(String name); |
float |
getFloatExtra(String name, float defaultValue); |
int[] |
getIntArrayExtra(String name); |
int |
getIntExtra(String name, int defaultValue); |
ArrayList<Integer> |
getIntegerArrayListExtra(String name); |
long[] |
getLongArrayExtra(String name); |
long |
getLongExtra(String name, long defaultValue); |
Parcelable[] |
getParcelableArrayExtra(String name); |
<T extends Parcelable>ArrayList<T> |
getParcelableArrayListExtra(String name); |
<T extends Parcelable> T |
getParcelableExtra(String name); |
Serializable |
getSerializableExtra(String name); |
short[] |
getShortArrayExtra(String name); |
short |
getShortExtra(String name, short defaultValue); |
String[] |
getStringArrayExtra(String name); |
ArrayList<String> |
getStringArrayListExtra(String name); |
String |
getStringExtra(String name); |
Cały kod naszej drugiej aktywności:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// Tutaj odczytujemy przesłane dane
String name = getIntent().getStringExtra("name");
}
}
Gotowe teraz wiemy już jak przekazywać dane między różnymi oknami w naszej aplikacji.
Dopisek (stan na 2026): mechanizm ekstrasów Intentu, czyli putExtra() i metody typu getStringExtra(), pozostaje aktualnym, oficjalnie dokumentowanym sposobem przekazywania danych między komponentami Androida. Przykłady w tym artykule są jednak napisane w Javie i pochodzą ze starszej wersji Android Studio. Współczesna dokumentacja Androida posługuje się Kotlinem.
Dzięki za artykuł z wyjaśnieniami działania intentu. Bardzo mi pomogły…
Serio?