Sobes.tech
Junior

Jak przekazać dane z jednej Activity do drugiej w Androidzie?

sobes.tech AI

Odpowiedź od AI

Istnieje kilka sposobów:

  1. Extras Intent: Najczęstszy sposób. Dane są pakowane w Bundle i dodawane do Intent.

    // W pierwszej Activity
    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("klucz", "wartość"); // Typy prymitywne
    intent.putExtra("obiekt", new MySerializableObject()); // Serializable
    startActivity(intent);
    
    // W drugiej Activity
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        String wartość = extras.getString("klucz");
        MySerializableObject obiekt = (MySerializableObject) extras.getSerializable("obiekt");
    }
    
  2. Obiekty Parcelable: Podobnie jak Serializable, ale bardziej wydajne dla często przesyłanych obiektów. Wymaga implementacji interfejsu Parcelable.

    // W pierwszej Activity
    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("parcelable_obiekt", new MyParcelableObject());
    startActivity(intent);
    
    // W drugiej Activity
    Intent intent = getIntent();
    MyParcelableObject parcelableObiekt = intent.getParcelableExtra("parcelable_obiekt");
    
  3. Shared Preferences: Odpowiednie do przesyłania niewielkich ilości danych, które muszą być zachowane między uruchomieniami aplikacji.

    // W pierwszej Activity
    SharedPreferences preferences = getSharedPreferences("moje_prefs", MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("klucz", "wartość");
    editor.apply(); // lub commit()
    
    // W drugiej Activity
    SharedPreferences preferences = getSharedPreferences("moje_prefs", MODE_PRIVATE);
    String wartość = preferences.getString("klucz", null); // null to wartość domyślna
    
  4. Zmienne statyczne: Niezalecane, ponieważ narusza zasady OOP i może prowadzić do wycieków pamięci. Używaj ostrożnie i tylko w bardzo prostych przypadkach.

    // W statycznej klasie lub innej dostępnej zmiennej statycznej
    public static String daneStatyczne;
    
    // W pierwszej Activity
    StaticDataHolder.daneStatyczne = "dane";
    
    // W drugiej Activity
    String dane = StaticDataHolder.daneStatyczne;
    
  5. Baza danych/Plik: Dla dużych ilości danych lub danych, które muszą być trwałe. Dane są zapisywane w bazie danych (SQLite, Room) lub pliku, a druga Activity je odczytuje.

  6. ViewModel (wspólnie z LiveData): W kontekście komponentów architektonicznych, ViewModel jest preferowanym sposobem zarządzania danymi i logiką UI. Dane między Activity są przekazywane przez wspólny ViewModel lub przez zdarzenia na LiveData.

    // W pierwszej Activity (Kotlin)
    val intent = Intent(this, SecondActivity::class.java).apply {
        putExtra("klucz_danych", "wartość_danych")
    }
    startActivity(intent)
    
    // W drugiej Activity (Kotlin)
    val dane = intent.getStringExtra("klucz_danych")
    

Wybór metody zależy od typu i ilości przesyłanych danych, a także od wymagań dotyczących trwałości. Przesyłanie danych przez Extras Intent jest standardem dla niewielkich ilości danych i bezpośrednich przejść między Activity.