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

Переживает ли ViewModel смену конфигурации в Android-приложении

1.6 Junior🔥 181 комментариев
#Android компоненты#UI и вёрстка

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

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

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

Краткий ответ

Да, ViewModel переживает смену конфигурации (например, поворот экрана, изменение языка, размера окна в multi-window) в Android-приложении, но не переживает уничтожение процесса или finish() Activity.

Детальное объяснение

ViewModel — это компонент архитектуры Android, специально разработанный для хранения и управления UI-данными способом, учитывающим жизненный цикл. Его ключевая задача — отделить данные, связанные с пользовательским интерфейсом, от Activity и Fragment, которые могут быть уничтожены и пересозданы из-за изменений конфигурации.

Как ViewModel сохраняется

Механизм выживания обеспечивается ViewModelStore, который хранится в объекте ViewModelProvider, привязанном к ViewModelStoreOwner (например, Activity или Fragment). При смене конфигурации происходит следующее:

// Пример создания ViewModel, которая переживет поворот экрана
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ViewModel будет переиспользована при смене конфигурации
        val viewModel: MyViewModel by viewModels()
        viewModel.someLiveData.observe(this) { data ->
            // Обновление UI
        }
    }
}

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val someLiveData: LiveData<String> get() = _data
    private val repository = DataRepository()

    init {
        loadData()
    }

    private fun loadData() {
        // Загрузка данных, которая не будет прервана поворотом экрана
        viewModelScope.launch {
            _data.value = repository.fetchData()
        }
    }
}

Ключевые моменты жизненного цикла ViewModel

  • Переживает смену конфигурации: Когда система уничтожает и пересоздает Activity/Fragment, их ViewModel НЕ уничтожается, а перепривязывается к новому экземпляру владельца.
  • Не переживает явного завершения Activity: При вызове finish() или когда пользователь нажимает "Назад", ViewModel очищается.
  • Не переживает уничтожение процесса: Если система убивает процесс приложения для освобождения памяти, ViewModel уничтожается вместе с ним. Для постоянного хранения данных следует использовать Repository, Room Database или DataStore.

Почему это важно

Без ViewModel разработчику приходилось бы вручную сохранять и восстанавливать состояние через onSaveInstanceState(), что подходило только для простых, сериализуемых данных. ViewModel же позволяет удобно хранить сложные объекты, LiveData, результаты сетевых запросов и другие данные в памяти, избегая их повторной загрузки при каждом повороте экрана.

Ограничения и лучшие практики

  • Не храните ссылки на View, Context или Activity в ViewModel, так как это приводит к утечкам памяти, поскольку ViewModel живет дольше, чем эти объекты.
  • Для работы, требующей Context (например, получение ресурсов), используйте AndroidViewModel.
  • ViewModel не является заменой onSaveInstanceState(). Для восстановления состояния после полного уничтожения процесса используйте их вместе:
class UserViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    // Сохраняем критичное UI-состояние (например, введенный текст в поле)
    var userName: String
        get() = savedStateHandle.get("userName") ?: ""
        set(value) = savedStateHandle.set("userName", value)

    // Здесь храним "тяжелые" данные, загруженные из сети/БД
    val userProfile: LiveData<Profile> = repository.getProfile()
}

Заключение

ViewModel — фундаментальный компонент современной Android-архитектуры, который элегантно решает проблему сохранения данных при смене конфигурации, повышая отзывчивость приложения и уменьшая нагрузку на ресурсы. Однако важно понимать границы его жизненного цикла и правильно комбинировать с другими механизмами сохранения состояния для создания устойчивых приложений.

Переживает ли ViewModel смену конфигурации в Android-приложении | PrepBro