Junior
Πώς μεταφέρουμε δεδομένα από μια δραστηριότητα σε μια άλλη;
sobes.tech AI
Απάντηση από AI
Τρόποι μεταφοράς δεδομένων:
- Extras Intent: Ο πιο συνηθισμένος τρόπος. Τα δεδομένα προστίθενται ως ζεύγη κλειδιού-τιμής στο
Intent.
// Στην Activity που στέλνει
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Γειά!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// Στην 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); // Με προεπιλεγμένη τιμή
}
Υποστηριζόμενοι τύποι: primitive, String, Bundle, Parcelable, Serializable. Για πολύπλοκα αντικείμενα προτιμάται το Parcelable.
- ViewModel (μαζί με LiveData ή Channel): Κατάλληλο για πιο σύνθετα σενάρια όπου τα δεδομένα πρέπει να διατηρούνται κατά τις περιστροφές οθόνης ή να χρησιμοποιούνται από πολλά συστατικά. Το DataFlow μπορεί να υλοποιηθεί μέσω
MutableLiveDataήChannel.
// Σε ένα κοινό ViewModel (π.χ., κοινό για την Activity και τα fragments)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data
fun setData(newData: MyData) {
_data.value = newData
}
// Στην Activity/Fragment που στέλνει
viewModel.setData(MyData(...))
// Στην Activity/Fragment που λαμβάνει και παρακολουθεί το ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
// Χρήση των δεδομένων
}
- Callback / Interface (κατά την εκκίνηση Activity για αποτέλεσμα): Χρησιμοποιείται όταν η λαμβάνουσα Activity πρέπει να επιστρέψει αποτέλεσμα στην αποστέλλουσα.
// Στην αποστέλλουσα 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");
}
}
});
// Εκκίνηση Activity για αποτέλεσμα
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// Στην Activity που λαμβάνει
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Αποτέλεσμα");
setResult(Activity.RESULT_OK, resultIntent);
finish();
- Τοπική βάση δεδομένων / Shared Preferences / Εσωτερική αποθήκευση: Για τη μεταφορά μεγάλων όγκων δεδομένων ή δεδομένων που πρέπει να διατηρούνται. Τα δεδομένα γράφονται σε αποθήκευση σε μία Activity και διαβάζονται σε άλλη.
// Εγγραφή (παράδειγμα Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Δεδομένα αποθηκεύτηκαν");
editor.apply();
// Ανάγνωση (παράδειγμα Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);
Αυτή η προσέγγιση απαιτεί επιπλέον λογική για τη διαχείριση του κύκλου ζωής των δεδομένων (πότε πρέπει να διαγραφούν).
-
Singleton / Παγκόσμιο στατικό αντικείμενο: Δεν συνιστάται λόγω πιθανών προβλημάτων διαρροής μνήμης και παραβίασης της αρχιτεκτονικής. Χρησιμοποιείται μόνο σε ακραίες και πολύ απλές περιπτώσεις.
// Κλάση 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; } }// Στην Activity που στέλνει DataHolder.getInstance().setData("Δεδομένα μέσω singleton");// Στην Activity που λαμβάνει String data = DataHolder.getInstance().getData();
Η επιλογή της μεθόδου εξαρτάται από τον όγκο των δεδομένων, την πολυπλοκότητα, την ανάγκη διατήρησής τους και την αλληλεπίδραση μεταξύ των Activity. Οι πιο συνηθισμένες και συνιστώμενες προσεγγίσεις είναι τα Extras του Intent και το ViewModel.