Sobes.tech
Junior

Hoe gegevens doorgeven van de ene Activity naar de andere?

sobes.tech AI

Antwoord van AI

Manieren om gegevens over te dragen:

  1. Intent Extras: De meest voorkomende methode. Gegevens worden toegevoegd als sleutel-waardeparen in de Intent.
// In de verzendende Activity
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Hallo!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// In de ontvangende Activity
Bundle extras = getIntent().getExtras();
if (extras != null) {
    String stringData = extras.getString("key_string");
    int intData = extras.getInt("key_int");
    boolean booleanData = extras.getBoolean("key_boolean", false); // Met standaardwaarde
}

Ondersteunde types: primitieve types, String, Bundle, Parcelable, Serializable. Voor complexe objecten worden Parcelable aanbevolen.

  1. ViewModel (samen met LiveData of Channel): Geschikt voor complexere scenario's waar gegevens bewaard moeten blijven bij schermrotaties of door meerdere componenten gebruikt worden. DataFlow kan geïmplementeerd worden via MutableLiveData of Channel.
// In een gedeelde ViewModel (bijvoorbeeld gedeeld door de host-Activity en fragments)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data

fun setData(newData: MyData) {
    _data.value = newData
}
// In de verzendende Activity/Fragment
viewModel.setData(MyData(...))
// In de ontvangende Activity/Fragment observing ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
    // Gebruik de gegevens
}
  1. Callback / Interface (bij het starten van een Activity voor resultaat): Gebruikt wanneer de ontvangende Activity een resultaat moet teruggeven aan de verzendende Activity.
// In de verzendende Activity
ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            Intent data = result.getData();
            if (data != null && data.getExtras() != null) {
                String resultData = data.getExtras().getString("result_key");
            }
        }
    });

// Start de Activity voor resultaat
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// In de ontvangende Activity
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Resultaat");
setResult(Activity.RESULT_OK, resultIntent);
finish();
  1. Lokale database / Shared Preferences / Internal Storage: Voor het overdragen van grote hoeveelheden gegevens of gegevens die bewaard moeten blijven. Gegevens worden opgeslagen in één Activity en gelezen in een andere.
// Opslaan (voorbeeld Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Gegevens opgeslagen");
editor.apply();
// Lezen (voorbeeld Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);

Deze aanpak vereist extra logica voor het beheren van de levenscyclus van gegevens (wanneer ze gewist moeten worden).

  1. Singleton / Globale statische object: Niet aanbevolen vanwege mogelijke geheugenlekken en schending van architectuur. Alleen gebruiken in uiterste en zeer eenvoudige gevallen.

    // Singleton klasse
    public class DataHolder {
        private static final DataHolder instance = new DataHolder();
        private String data;
    
        private DataHolder() {}
    
        public static DataHolder getInstance() {
            return instance;
        }
    
        public String getData() {
            return data;
        }
    
        public void setData(String data) {
            this.data = data;
        }
    }
    
    // In de verzendende Activity
    DataHolder.getInstance().setData("Gegevens via singleton");
    
    // In de ontvangende Activity
    String data = DataHolder.getInstance().getData();
    

De keuze van methode hangt af van de hoeveelheid gegevens, complexiteit, noodzaak tot bewaren en de interactie tussen Activity's. De meest gebruikte en aanbevolen methoden zijn Intent Extras en ViewModel.