Есть ли необходимость использовать onSaveInstanceState и onRestoreInstanceState при использовании компонентов архитектуры Android LiveData & ViewModel?

Компоненты архитектуры Android обеспечивают LiveData а также ViewModel классы, которые более дружественны к жизненному циклу и предназначены для более узкого занятия / фрагмента. Эти классы обрабатывают хранение данных при изменениях конфигурации, но я запутался в их использовании по сравнению с API-интерфейсами Activity Framework. Являются onSaveInstanceState(Bundle) а также onRestoreInstanceState(Bundle) все еще необходимо или полезно для сохранения состояния активности?

3 ответа

onSaveInstanceState & onRestoreInstanceState по-прежнему полезен.

ViewModel хранит данные только тогда, когда процесс жив.
Но onSaveInstanceState & onRestoreInstanceState могут содержать данные, даже если процесс завершен.

ViewModel прост в использовании и полезен для сохранения больших данных при изменении ориентации экрана.
onSaveInstanceState & onRestoreInstanceState могут сохранять данные, когда процесс находится в фоновом режиме (в фоновом режиме процесс приложения может быть в любой момент убит системой).

Предположим сценарий: пользователь находится в activity A, затем переходит к activity B

но из-за нехватки памяти ОС Android разрушает activity A, поэтому ViewModelсвязанный с ним тоже разрушает. (Вы можете подражать этому, проверивDon't keep activities в параметрах разработчика)

теперь пользователь возвращается к activity A, ОС Android пытается создать новый Acivity а также ViewModelобъекты. поэтому вы потеряли данные вViewModel.

Но все же значения в saveInstanceState есть.

Как и другие ответы, в которых говорится о сохранении , помимо простых изменений конфигурации, я думаю, что есть еще пара вариантов использования:

Причины производительности

Иногда вы не хотите хранить все последние значения атрибутов представления впо соображениям производительности. Вам может понадобиться сохранить их при повторном создании представления. Например, позиция прокрутки пользователя в представлении в вашей активности/фрагменте. Вы, вероятно, не хотите сохранять положение прокрутки каждый раз, когда пользователь прокручивает. Но вы можете сохранить это, чтобы вы могли восстановить его при воссоздании представления ().

Инициализация для выполнения после восстановления

Некоторым представлениям может потребоваться инициализация, особенно из-за восстановления, поскольку сложный дизайн этих представлений не позволяет сохранить все. Например, у меня было, и если пользователь загружал страницу во время изменения конфигурации, я хочу, чтобыпопытаться загрузить новую страницу (а не старую). После восстановления состояния наблюдателиполучит самые последние значения, но это не сильно поможет в чем-то подобном (я хочу, чтобы представление загружало страницу из ViewModel только в момент восстановления, а не в другое время). Поэтому мы просто делаем эту инициализацию через состояние восстановления.

Заключительное слово

Со всеми этими вещами я бы рекомендовал сохранитьикак можно проще. В идеале просто вызовите метод ViewModel и все. Затем мы можем извлечь всю логику из представления в ViewModel, а представление останется с шаблонным кодом.