Назад к вопросам
Middle
71
questionbank

Как происходит сохранение состояния представления (view) в Android?

Sobes Copilot

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

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

sobes.tech AI

При изменении конфигурации (например, поворот экрана), Android уничтожает и воссоздает активность. Состояние представления сохраняется автоматически, если у него установлен ID.

Механизмы сохранения состояния представления:

  • Автоматическое сохранение: Android запоминает определенные свойства виджетов с ID (например, текст в TextView, checked состояние в CheckBox).

  • Programmatic Save/Restore: Можно вручную сохранять и восстанавливать состояние, переопределяя методы:

    // Сохранение состояния
    override fun onSaveInstanceState(): Parcelable? {
        // Сохраняем собственное состояние
        return super.onSaveInstanceState()
    }
    
    // Восстановление состояния
    override fun onRestoreInstanceState(savedInstanceState: Parcelable?) {
        super.onRestoreInstanceState(savedInstanceState)
        // Восстанавливаем собственное состояние
    }
    

    Внутри представления (классы, унаследованные от View):

    // Сохранение состояния в представлении
    override fun onSaveInstanceState(): Parcelable {
        // Сохраняем собственное состояние и состояние родителя
        return super.onSaveInstanceState()
    }
    
    // Восстановление состояния в представлении
    override fun onRestoreInstanceState(state: Parcelable?) {
        // Восстанавливаем собственное состояние и состояние родителя
        super.onRestoreInstanceState(state)
    }
    
  • Сохранение через ViewModel: Рекомендуемый способ для сохранения данных, не связанных напрямую с UI. ViewModel переживает изменения конфигурации.

  • Сохранение через SavedStateHandle в ViewModel: Позволяет сохранять и восстанавливать небольшие объемы данных в ViewModel автоматически, используя те же механизмы, что и onSaveInstanceState.

// Пример SavedStateHandle в ViewModel
class MyViewModel(private val state: SavedStateHandle) : ViewModel() {
    private val counterKey = "counter"

    var counter: Int
        get() = state.get(counterKey) ?: 0
        set(value) {
            state.set(counterKey, value)
        }
}
  • LocalViewStateManager: (Не является стандартным API, может быть кастомной реализацией) Для более сложного управления состоянием внутри представления.

В целом, автоматическое сохранение по ID справляется с базовыми случаями. Для сохранения более сложного состояния и бизнес-логики используются ViewModel с SavedStateHandle или ручное переопределение методов сохранения/восстановления.