Sobes.tech
Junior

Hogyan lehet adatokat átadni egyik Activity-ből a másikba?

sobes.tech MI

Válasz az MI-től

Adatok átadásának módjai:

  1. Intent Extras: A leggyakoribb módszer. Az adatok kulcs-érték párok formájában kerülnek hozzáadásra az Intent-hez.
// Az elküldő Activity-ben
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Szia!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// A fogadó Activity-ben
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); // Alapértelmezett értékkel
}

Támogatott típusok: primitívek, String, Bundle, Parcelable, Serializable. Komplex objektumok esetén a Parcelable ajánlott.

  1. ViewModel (együtt LiveData vagy Channel): Komplexebb szcenáriókhoz alkalmas, ahol az adatoknak meg kell maradniuk képernyőforgatáskor vagy több komponens által történő használat esetén. Az adatfolyam megvalósítható MutableLiveData vagy Channel segítségével.
// Egy közös ViewModel-ben (pl. közös a gazda Activity és a fragmentek között)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data

fun setData(newData: MyData) {
    _data.value = newData
}
// Az elküldő Activity/Fragment-ben
viewModel.setData(MyData(...))
// A fogadó Activity/Fragment-ben megfigyelve a ViewModel-t
viewModel.data.observe(viewLifecycleOwner) { data ->
    // Az adatok használata
}
  1. Visszahívás / Interfész (Activity indítása eredményért): Akkor használatos, amikor a fogadó Activity-nek vissza kell adnia eredményt az elküldőnek.
// Az elküldő Activity-ben
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");
            }
        }
    });

// Activity indítása eredményért
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// A fogadó Activity-ben
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Eredmény");
setResult(Activity.RESULT_OK, resultIntent);
finish();
  1. Helyi adatbázis / Shared Preferences / Belső tárhely: Nagyobb adatmennyiség vagy tartós adatok átadására. Az adatok egy Activity-ben íródnak be, és egy másikban olvashatók.
// Írás (példa Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Adatok mentve");
editor.apply();
// Olvasás (példa Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);

Ez a megközelítés további logikát igényel az adatok életciklusának kezeléséhez (mikor kell törölni őket).

  1. Singleton / Globális statikus objektum: Nem ajánlott a memóriaszivárgások és az architektúra megsértése miatt. Csak szélsőséges és nagyon egyszerű esetekben használható.

    // Singleton osztály
    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;
        }
    }
    
    // Az elküldő Activity-ben
    DataHolder.getInstance().setData("Adatok singletonon keresztül");
    
    // A fogadó Activity-ben
    String data = DataHolder.getInstance().getData();
    

A módszer kiválasztása az adatmennyiségtől, összetettségtől, megőrzési szükséglettől és az Activity-k közötti interakciótól függ. A leggyakrabban használt és ajánlott módszerek az Intent Extras és a ViewModel.