Junior
Kā pārsūtīt datus no vienas Activity uz citu?
sobes.tech AI
Atbilde no AI
Datu pārraides veidi:
- Intent Extras: Visbiežāk izmantotais veids. Dati kā atslēgas-vertības pāri tiek pievienoti
Intent.
// Sūtošajā Activity
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Sveiki!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// Saņemšanas 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); // Ar noklusējuma vērtību
}
Atbalstītie tipi: primitiivi, String, Bundle, Parcelable, Serializable. Sarežģītākiem objektiem ieteicams izmantot Parcelable.
- ViewModel (kopā ar LiveData vai Channel): Piemērots sarežģītākiem scenārijiem, kur dati jāuztur ekrāna pagriešanas laikā vai jāizmanto vairākām komponentēm. DataFlow var realizēt ar
MutableLiveDatavaiChannel.
// Kopīgā ViewModel (piemēram, kopīga aktivitātei un fragmentiem)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data
fun setData(newData: MyData) {
_data.value = newData
}
// Sūtošajā Activity/Fragment
viewModel.setData(MyData(...))
// Saņemšanas Activity/Fragment novēro ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
// Datu izmantošana
}
- Atzvanījums / Saskarne (Activity rezultāta iegūšanai): Izmanto, kad saņemamā Activity jāatgriež rezultāts sūtītājai.
// Sūtītājā 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");
}
}
});
// Aktivācijas uzsākšana
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// Saņemšanas Activity
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Rezultāts");
setResult(Activity.RESULT_OK, resultIntent);
finish();
- Lokāla datu bāze / Shared Preferences / Iekšējā glabāšana: Lielāku datu pārsūtīšanai vai saglabāšanai:
// Ieraksts (piemērs ar Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Dati saglabāti");
editor.apply();
// Nolasīšana (piemērs ar Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);
Šis pieejas veids prasa papildu loģiku datu dzīves cikla pārvaldībai.
-
Singlyton / Globāls statisks objekts: Neiesaka dēļ potenciālām atmiņas noplūdēm un arhitektūras pārkāpumiem. Izmantojiet tikai ārkārtējos un ļoti vienkāršajos gadījumos.
// Singltona klase 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; } }// Sūtītājā Activity DataHolder.getInstance().setData("Dati caur singltonu");// Saņēmējā Activity String data = DataHolder.getInstance().getData();
Izvēle ir atkarīga no datu apjoma, sarežģītības, nepieciešamības tos saglabāt un mijiedarbības starp Activity. Visbiežāk un ieteicams ir izmantot Intent Extras un ViewModel.