Junior
Ako preniesť údaje z jednej Activity do druhej?
sobes.tech AI
Odpoveď od AI
Spôsoby prenosu dát:
- Intent Extras: Najbežnejší spôsob. Dáta vo forme párov kľúč-hodnota sa pridávajú do
Intent.
// V odosielajúcej Activity
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Ahoj!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// V prijímajúcej 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); // S predvolenou hodnotou
}
Podporované typy: primitívy, String, Bundle, Parcelable, Serializable. Pre zložité objekty sú vhodnejšie Parcelable.
- ViewModel (spolu s LiveData alebo Channel): Vhodné pre zložitejšie scenáre, kde je potrebné uchovávať dáta pri otáčaní obrazovky alebo ich používať viacerými komponentmi. DataFlow možno implementovať cez
MutableLiveDataaleboChannel.
// V spoločnej ViewModel (napríklad pre hostiteľskú Activity a fragmenty)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data
fun setData(newData: MyData) {
_data.value = newData
}
// V odosielajúcej Activity/Fragment
viewModel.setData(MyData(...))
// V prijímajúcej Activity/Fragment pozorovanie ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
// Použitie dát
}
- Callback / Interface (pri spustení Activity pre výsledok): Používa sa, keď prijímajúca Activity má vrátiť výsledok odosielajúcej Activity.
// V odosielajúcej 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");
}
}
});
// Spustenie Activity pre výsledok
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// V prijímajúcej Activity
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Výsledok");
setResult(Activity.RESULT_OK, resultIntent);
finish();
- Lokálna databáza / Shared Preferences / Interné úložisko: Pre prenos veľkých objemov dát alebo dát, ktoré majú byť uložené. Dáta sa zapisujú do úložiska v jednej Activity a čítajú v inej.
// Zápis (príklad Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Dáta uložené");
editor.apply();
// Čítanie (príklad Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);
Tento prístup vyžaduje ďalšiu logiku na správu životného cyklu dát (kedy ich vyčistiť).
-
Singleton / Globálny statický objekt: Neodporúča sa kvôli potenciálnym problémom s únikom pamäte a narušením architektúry. Používať len v krajnom a veľmi jednoduchom prípade.
// Trieda 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; } }// V odosielajúcej Activity DataHolder.getInstance().setData("Dáta cez singleton");// V prijímajúcej Activity String data = DataHolder.getInstance().getData();
Výber metódy závisí od objemu dát, ich zložitosti, potreby ich uloženia a požadovanej interakcie medzi Activity. Najbežnejšie a odporúčané prístupy sú Intent Extras a ViewModel.