onSaveInstanceState()
используется для сохранения состояния активити при изменении конфигурации.onSaveInstanceState()
сохраняет данные в объекте Bundle, который реализует ассоциативный массив (хранилище вида ключ-значение).Ранее мы писали, что данные, сохраненные через
onSaveInstanceState()
, переживают остановку процесса приложения. Это значит, что Bundle
хранится не в памяти приложения. Также известно, что
onSaveInstanceState()
не сохраняет данные на диске. Это можно понять потому, что состояния приложений не могут быть восстановлены после перезагрузки девайса. Кроме того документация класса Parcel
, который используется для сохранения Parcelable
объектов в Bundle
, не рекомендует использовать Parcel
для persistent storage.Где же сохраняется
Bundle
из onSaveInstanceState()
?Ответ: в системном классе
ActivityManagerService
, о котором мы уже писали в посте о запуске приложения.Для каждой запущенной активити создается инстанс класса
ActivityRecord
. Этот класс имеет поле icicle
типа Bundle
. Именно в это поле сохраняется состояние после вызова onSaveInstanceState()
. При остановке активити
Bundle
отправляется в системный процесс через Bindler IPC. Далее на классе ActivityManagerService
вызывается метод activityStopped()
, который принимает объект Bundle
. Этот метод находит ActivityRecord
, соответствующий остановленной активити и записывает полученный Bundle
в поле icicle
класса ActivityRecord
.Данная реализация не задокументирована и может быть изменена в будущих версиях Android.