Назад к вопросам
Junior
78
questionbank

Как передать данные из одной Activity в другую?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Способы передачи данных:

  1. Intent Extras: Самый распространенный способ. Данные в виде пар ключ-значение добавляются в 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 observing ViewModel
viewModel.data.observe(viewLifecycleOwner) { data ->
    // Использовать данные
}
  1. Callback / Interface (при запуске Activity для результата): Используется, когда принимающая 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 / Internal Storage: Для передачи больших объемов данных или данных, которые должны сохраняться. Данные записываются в хранилище в одной 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. Наиболее распространенные и рекомендуемые подходы - Intent Extras и ViewModel.