← Назад к вопросам

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

1.0 Junior🔥 201 комментариев
#Android компоненты#Другое#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные способы передачи данных между Activity в Android

В Android существует несколько стандартных и эффективных подходов для передачи данных между компонентами Activity. Выбор конкретного метода зависит от типа, объема передаваемых данных и архитектурных требований приложения.

1. Использование Intent с явными ключами (Bundle)

Самый распространенный и базовый способ — использование объекта Intent и метода putExtra(). Данные упаковываются в Bundle и передаются при запуске новой Activity.

// В отправляющей Activity
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("USER_NAME", "Иван Петров")
intent.putExtra("USER_AGE", 28)
intent.putExtra("IS_PREMIUM", true)
startActivity(intent)

// В принимающей Activity (SecondActivity)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    val userName = intent.getStringExtra("USER_NAME")
    val userAge = intent.getIntExtra("USER_AGE", 0)
    val isPremium = intent.getBooleanExtra("IS_PREMIUM", false)
    
    // Использование полученных данных
}

Ключевые моменты:

  • Поддерживает примитивные типы, строки, массивы и объекты, реализующие интерфейс Parcelable или Serializable
  • Для сложных объектов рекомендуется использовать Parcelable из-за лучшей производительности
  • Ограничение по размеру передаваемых данных (обычно 1MB)

2. Передача объектов через Parcelable

Для передачи пользовательских объектов необходимо реализовать интерфейс Parcelable.

// Модель данных
@Parcelize
data class User(
    val id: Long,
    val name: String,
    val email: String
) : Parcelable

// Отправка
val user = User(1, "Алексей", "alex@example.com")
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("USER_DATA", user)
startActivity(intent)

// Получение
val receivedUser = intent.getParcelableExtra<User>("USER_DATA")

Аннотация @Parcelize значительно упрощает реализацию (требуется плагин kotlin-parcelize).

3. Использование ViewModel и Shared ViewModels (рекомендуемый современный подход)

В архитектуре MVVM с использованием Android Jetpack рекомендуется применять общие ViewModel через ViewModelProvider и activityViewModels().

// Общая ViewModel
class SharedViewModel : ViewModel() {
    val selectedItem = MutableLiveData<String>()
    
    fun selectItem(item: String) {
        selectedItem.value = item
    }
}

// В обеих Activity (в пределах одного процесса)
class FirstActivity : AppCompatActivity() {
    private val viewModel: SharedViewModel by activityViewModels()
    
    fun sendData() {
        viewModel.selectItem("Важные данные")
    }
}

class SecondActivity : AppCompatActivity() {
    private val viewModel: SharedViewModel by activityViewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        viewModel.selectedItem.observe(this) { item ->
            // Реакция на изменение данных
        }
    }
}

4. Локальная база данных или SharedPreferences

Для постоянного хранения данных, которые должны быть доступны в разных частях приложения:

  • Room Database — для структурированных данных
  • DataStore (современная замена SharedPreferences) — для простых ключ-значение пар
  • SharedPreferences (устаревший, но все еще используемый)

5. Использование статических полей или Singleton

Хотя этот подход противоречит принципам чистой архитектуры, иногда используется для быстрого прототипирования:

object DataHolder {
    var transferData: Any? = null
}

// Установка данных перед запуском Activity
DataHolder.transferData = myDataObject
startActivity(Intent(this, SecondActivity::class.java))

// Получение в другой Activity
val data = DataHolder.transferData

Недостатки: риск утечек памяти, проблемы с жизненным циклом, сложность тестирования.

Сравнительная таблица методов

МетодПреимуществаНедостаткиРекомендуется для
Intent + BundleПростота, встроенная поддержкаОграничения по размеру, только простые типыПростых данных, навигации
ParcelableВысокая производительность, типизацияУсложнение кода моделейСложных объектов
Shared ViewModelРеактивность, разделение ответственностиТребует архитектурных компонентовСовременных приложений с MVVM
База данныхПостоянное хранение, сложные запросыИзбыточность для временных данныхПостоянных данных, больших объемов

Рекомендации по выбору метода

  1. Для простых данных и навигации — используйте Intent с Bundle
  2. Для передачи сложных объектов — реализуйте Parcelable с аннотацией @Parcelize
  3. В современных приложениях с архитектурными компонентами — применяйте Shared ViewModel
  4. Для данных, сохраняемых между сессиями — используйте Room или DataStore
  5. Избегайте статических полей и синглтонов для передачи данных между Activity

Важное замечание: При передаче больших объемов данных (например, Bitmap) рекомендуется не использовать Intent, а загружать данные в памяти или БД и передавать только ссылку/идентификатор.

Выбор оптимального метода зависит от конкретного сценария использования, но в современных Android-приложениях предпочтение стоит отдавать подходам, основанным на архитектурных компонентах Jetpack, которые обеспечивают лучшее разделение ответственности, тестируемость и работу с жизненным циклом приложения.