Sobes.tech
Junior

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:

  1. 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çin Parcelable tercih edilir.

  2. 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ışı MutableLiveData veya Channel aracı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
    }
    
  3. 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();
    
  4. 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).

  5. 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.