Sobes.tech
Junior

Cum se transmit datele dintr-o Activity în alta?

sobes.tech AI

Răspuns de la AI

Modalități de transfer de date:

  1. Extras Intent: Cea mai comună metodă. Datele sunt adăugate sub formă de perechi cheie-valoare în Intent.
// În Activity-ul care trimite
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Salut!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// În Activity-ul care primește
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); // Cu valoare implicită
}

Tipuri suportate: primitive, String, Bundle, Parcelable, Serializable. Pentru obiecte complexe, se recomandă Parcelable.

  1. ViewModel (împreună cu LiveData sau Channel): Potrivit pentru scenarii mai complexe, unde datele trebuie păstrate la rotirea ecranului sau utilizate de mai multe componente. DataFlow poate fi implementat prin MutableLiveData sau Channel.
// Într-un ViewModel comun (de exemplu, comun pentru Activity gazdă și fragmente)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data

fun setData(newData: MyData) {
    _data.value = newData
}
// În Activity/Fragment care trimite
viewModel.setData(MyData(...))
// În Activity/Fragment care primește și observă ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
    // Utilizare date
}
  1. Callback / Interfață (la lansarea unei Activity pentru rezultat): Folosit când Activity-ul care primește trebuie să returneze un rezultat către Activity-ul care trimite.
// În Activity-ul care trimite
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");
            }
        }
    });

// Pornirea Activity-ului pentru rezultat
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// În Activity-ul care primește
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Rezultat");
setResult(Activity.RESULT_OK, resultIntent);
finish();
  1. Bază de date locală / Shared Preferences / Stocare internă: Pentru transferul unor volume mari de date sau date care trebuie păstrate. Datele sunt scrise într-un storage într-o Activity și citite în alta.
// Scriere (exemplu Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Date salvate");
editor.apply();
// Citire (exemplu Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);

Această metodă necesită logică suplimentară pentru gestionarea ciclului de viață al datelor (când trebuie șterse).

  1. Singleton / Obiect static global: Nu recomandat din cauza potențialelor probleme cu scurgerile de memorie și încălcarea arhitecturii. Se folosește doar în cazuri extreme și foarte simple.

    // Clasa singleton
    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;
        }
    }
    
    // În Activity-ul care trimite
    DataHolder.getInstance().setData("Date prin singleton");
    
    // În Activity-ul care primește
    String data = DataHolder.getInstance().getData();
    

Alegerea metodei depinde de volumul de date, complexitatea, necesitatea de a le păstra și de interacțiunea între Activity-uri. Cele mai frecvent utilizate și recomandate sunt Extras-urile Intent și ViewModel.