Junior
Kaip perduoti duomenis iš vienos Activity į kitą?
sobes.tech AI
Atsakymas iš AI
Duomenų perdavimo būdai:
- Intent Extras: Dažniausias būdas. Duomenys porų raktas-reikšmė forma pridedami prie
Intent.
// Siunčiančioje Activity
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Labas!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// Priimančioje 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); // Su numatytąja verte
}
Palaikomi tipai: primityvai, String, Bundle, Parcelable, Serializable. Sudėtingesniems objektams rekomenduojama naudoti Parcelable.
- ViewModel (kartu su LiveData arba Channel): Tinka sudėtingesniems scenarijams, kai duomenys turi būti išsaugoti ekrano pasukimo metu arba naudojami kelių komponentų. DataFlow galima įgyvendinti per
MutableLiveDataarbaChannel.
// Bendroje ViewModel (pavyzdžiui, bendroje Activity ir fragmentuose)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data
fun setData(newData: MyData) {
_data.value = newData
}
// Siunčiančioje Activity/Fragment
viewModel.setData(MyData(...))
// Priimančioje Activity/Fragment stebėti ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
// Naudoti duomenis
}
- Kvietimas / Sąsaja (Activity rezultatui gauti): Naudojama, kai priimanti Activity turi grąžinti rezultatą siuntėjai.
// Siunčiančioje 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");
}
}
});
// Paleisti Activity rezultatui
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// Priimančioje Activity
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Rezultatas");
setResult(Activity.RESULT_OK, resultIntent);
finish();
- Vietinė duomenų bazė / Shared Preferences / Vidinis saugykla: Skirta dideliems duomenų kiekiams arba duomenims, kurie turi būti išsaugoti. Duomenys įrašomi į saugyklą vienoje Activity ir skaitomi kitoje.
// Rašymas (pavyzdys su Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Duomenys išsaugoti");
editor.apply();
// Skaitymas (pavyzdys su Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);
Šis metodas reikalauja papildomos logikos duomenų gyvavimo ciklo valdymui.
-
Singleton / Globalus statinis objektas: Nerekomenduojama dėl galimų atminties nutekėjimų ir architektūros pažeidimų. Naudokite tik kraštutiniais ir labai paprastais atvejais.
// Singleton klasė 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; } }// Siunčiančioji Activity DataHolder.getInstance().setData("Duomenys per singleton");// Priimančioji Activity String data = DataHolder.getInstance().getData();
Pasirinkimas priklauso nuo duomenų kiekio, jų sudėtingumo, išsaugojimo poreikio ir sąveikos tarp Activity reikalavimų. Dažniausiai rekomenduojami ir plačiausiai naudojami metodai yra Intent Extras ir ViewModel.