Sobes.tech
Junior

Как да прехвърлим данни от една Activity към друга?

sobes.tech AI

Отговор от AI

Начини за прехвърляне на данни:

  1. 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); // С подразбираща се стойност
}

Поддържани типове: примитиви, String, Bundle, Parcelable, Serializable. За сложни обекти се препоръчва Parcelable.

  1. ViewModel (заедно с LiveData или Channel): Подходящ за по-сложни сценарии, където данните трябва да се запазват при завъртане на екрана или да се използват от няколко компонента. DataFlow може да се реализира чрез MutableLiveData или Channel.
// В общ ViewModel (например, общ за хостинг Activity и фрагменти)
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 ->
    // Използване на данните
}
  1. Обратен повик / интерфейс (при стартиране на 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();
  1. Локална база данни / 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);

Този подход изисква допълнителна логика за управление на жизнения цикъл на данните (кога да се изтриват).

  1. Сингълтон / Глобален статичен обект: Не се препоръчва поради потенциални проблеми с изтичане на памет и нарушаване на архитектурата. Използвайте само в крайни и много прости случаи.

    // Клас сингълтон
    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("Данни чрез сингълтон");
    
    // В получаващата Activity
    String data = DataHolder.getInstance().getData();
    

Изборът на метод зависи от обема на данните, тяхната сложност, необходимостта от запазване и взаимодействието между Activity. Най-често препоръчваните и използвани подходи са Extras на Intent и ViewModel.