Bir Activity'den diğerine nasıl veri aktarılır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Veri aktarım yöntemleri:
-
Intent Ekleri: En yaygın yöntem. Anahtar-değer çiftleri şeklinde veriler
Intent'e eklenir.// Gönderen Activity'de Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key_string", "Merhaba!"); intent.putExtra("key_int", 42); intent.putExtra("key_boolean", true); startActivity(intent);// Alan Activity'de 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); // Varsayılan değer ile }Desteklenen tipler: primitifler,
String,Bundle,Parcelable,Serializable. Karmaşık nesneler içinParcelabletercih edilir. -
ViewModel (LiveData veya Channel ile birlikte): Daha karmaşık senaryolar için uygundur, ekran döndürmelerinde verilerin korunması veya birden fazla bileşen tarafından kullanılması gereken durumlar. Veri akışı
MutableLiveDataveyaChannelaracılığıyla gerçekleştirilebilir.// Ortak ViewModel'da (örneğin, ana Activity ve fragmentler arasında) private val _data = MutableLiveData<MyData>() val data: LiveData<MyData> = _data fun setData(newData: MyData) { _data.value = newData }// Gönderen Activity/Fragment'ta viewModel.setData(MyData(...))// Alan Activity/Fragment'ta ViewModel'i gözlemleme viewModel.data.observe(viewLifecycleOwner) { data -> // Verileri kullan } -
Callback / Arayüz (Activity'yi sonuç için başlatma): Alan Activity'nin, gönderen Activity'ye sonuç döndürmesi gerektiğinde kullanılır.
// Gönderen Activity'de 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 başlat Intent intent = new Intent(this, TargetActivity.class); someActivityResultLauncher.launch(intent);// Alan Activity'de Intent resultIntent = new Intent(); resultIntent.putExtra("result_key", "Sonuç"); setResult(Activity.RESULT_OK, resultIntent); finish(); -
Yerel veritabanı / Shared Preferences / İç Depolama: Büyük veri miktarlarının veya kalıcı olması gereken verilerin aktarımı için kullanılır. Veriler bir Activity'de yazılır ve başka bir Activity'de okunur.
// Yazma (Shared Preferences örneği) SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("saved_data", "Veriler kaydedildi"); editor.apply();// Okuma (Shared Preferences örneği) SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); String savedData = sharedPref.getString("saved_data", null);Bu yaklaşım, verilerin yaşam döngüsünü yönetmek için ek mantık gerektirir (ne zaman silinecek).
-
Singleton / Küresel statik nesne: Tavsiye edilmez çünkü bellek sızıntısı ve mimari ihlali riskleri taşır. Sadece çok temel ve sınırlı durumlarda kullanılmalıdır.
// Singleton sınıfı 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; } }// Gönderen Activity'de DataHolder.getInstance().setData("Singleton aracılığıyla veri");// Alan Activity'de String data = DataHolder.getInstance().getData();
Yöntem seçimi, veri hacmine, karmaşıklığına, kalıcılık ihtiyacına ve Activity'ler arasındaki etkileşime bağlıdır. En yaygın ve önerilen yaklaşımlar Intent Ekleri ve ViewModel'dir.