Junior
Kuidas edastada andmeid ühest Activity'st teise?
sobes.tech AI
Vastus AI-lt
Andmeedastuse viisid:
- Intent Extras: Kõige levinum viis. Andmed parool-väärtus paaridena lisatakse
Intent-i.
// Saadvas Activity
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Tere!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// Vastuvõtvas 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); // Vaikimisi väärtus
}
Toetatud tüübid: primitiivid, String, Bundle, Parcelable, Serializable. Keerulisemate objektide jaoks soovitatakse kasutada Parcelable.
- ViewModel (koos LiveData või Channel-iga): Sobib keerulisemate stsenaariumide jaoks, kus andmeid tuleb säilitada ekraani pööramisel või kasutada mitme komponendi vahel. DataFlow saab realiseerida
MutableLiveDatavõiChannelkaudu.
// Ühises ViewModelis (näiteks host-Activity ja fragmentide jaoks)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data
fun setData(newData: MyData) {
_data.value = newData
}
// Saadvas Activity/Fragment
viewModel.setData(MyData(...))
// Vastuvõtvas Activity/Fragment jälgib ViewModel-i
viewModel.data.observe(viewLifecycleOwner) { data ->
// Andmete kasutamine
}
- Tagasiside / Interfeiss (Activity tulemuse saamiseks): Kasutatakse, kui vastuvõttev Activity peab tagastama tulemuse saatvale Activity-le.
// Saadvas 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");
}
}
});
// Tulemuse saamiseks Activity käivitamine
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// Vastuvõtvas Activity
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Tulemus");
setResult(Activity.RESULT_OK, resultIntent);
finish();
- Kohalik andmebaas / Shared Preferences / Internal Storage: Kasutatakse suuremate andmekogumite või andmete salvestamiseks. Andmed kirjutatakse ühes Activitysse ja loetakse teises.
// Kirjutamine (näide Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Andmed on salvestatud");
editor.apply();
// Lugemine (näide Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);
See lähenemine nõuab täiendavat loogikat andmete elutsükli haldamiseks.
-
Singleton / Globaalne staatiline objekt: Ei soovitata seetõttu, et võib põhjustada mälulekkeid ja arhitektuuri rikkumisi. Kasutada ainult äärmuslikel ja väga lihtsatel juhtudel.
// Singleton klass 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; } }// Saadvas Activity DataHolder.getInstance().setData("Andmed singletoni kaudu");// Vastuvõtvas Activity String data = DataHolder.getInstance().getData();
Valik sõltub andmete mahust, keerukusest, säilitamise vajadusest ja suhtluse nõuetest. Kõige tavalisemad ja soovitatavad meetodid on Intent Extras ja ViewModel.