3 апреля 2014 г.

Сохранение состояния Активности. Часть 1

Продолжаем перевод статьи с альма-матер. Начало статьи тут.

В начале надо сказать, что пользоваться эмулятором AVD для Android 2.3.3, крайне не рекомендуется, так как он крайне глюкавый, как оказалось. Выражалось это в том, что он ни как не отображал вызов метода onRestoreInstanceState, а так же не корректно отображал поведение приложения при повороте экрана. Поэтому рекомендую использовать Genymotion или же реальное устройство для тестирования приложения которое я приведу ниже.

А сейчас продолжение перевода.

Система вызывает метод onSaveInstanceState() перед тем как активность может быть уничтожена. Система передает в этот метод объект Bundle, в котором вы можете сохранить состояние параметров активности в виде пар “параметр”-“значение”, используя такие методы как putString() и putInt(). Затем, если система уничтожает процесс вашего приложения, а пользователь решает вернуться к вашей Актиновсти, то система восстанавливает Активность и передает ей объект Bundle в методах onCreate() и onRestoreInstanceState().Используя эти методы вы можете извлечь сохраненные данные из объекта Bundle и восстановить состояние Активности. Если же ни какой информации для восстановления нет, то объект Bundle вернет вам значение null (обычно такое бывает в случае когда активность создается в первый раз).

restore_instance

На рисунке показано два варианта когда Активность получает фокус и ее состояние сохраняется и восстанавливается или остается не тронутым. Если Активность уничтожается и затем воссоздается, то ее состояние восстанавливается из сохраненного состояния. Если же Активность была приостановлена и затем ее работа была возобновлена, то ее состояние остается нетронутым.

И еще раз приведу интересное замечание из предыдущей статьи.

Нет ни какой гарантии что onSaveInstanceState() будет вызвана перед тем как ваша Активность будет уничтожена, поскольку есть случаи в которых сохранение состояния не является необходимым (например, когдапользователь покидает вашу активность используя кнопку ОБРАТНО, то это означает, что пользователь сам прекратил работу с Активностью). Если система вызывает onSaveInstanceState(), то делает это до onStop() ивозможно перед onPause().

Однако, даже если вы не используете метод onSaveInstanceState(), некоторые данные состояния Активности восстанавливаются классом Активности по умолчанию поскольку к ним по умолчанию применяется метод onSaveInstanceState(). В частности метод onSaveInstanceState(), по умолчанию, сохраняется состояние каждого View в разметке (layout). Почти каждый виджет в Андроид использует этот метод для сохранения своего состояния, так чтобы любые видимые изменения в UI сохранялись и восстанавливались автоматически при воссоздании Активности. Например, виджет EditText сохраняет любой текст введенный в него пользователем, а виджет CheckBox сохраняет состояние был он отмечен или нет. Единственное что от вас требуется для этого, то это присвоить каждому виджету, состояние которого вы хотите сохранить, уникальный идентификатор ID (атрибут android:id). Если у виджета нет ID, то система не сможет сохранить его состояние.

Хотя метод onSaveInstanceState() и сохраняет, по умолчанию, состояние UI Активности, все же иногда может потребоваться его переопределить, чтобы сохранить дополнительную информацию. Для этого вы всегда должны вызывать суперкласс метода onSaveInstanceState() перед тем как сделаете, что либо еще. Так же необходимо будет переопределить и метод onRestoteInstanceState() вызвав его суперкласс и восстановив необходимую дополнительную информацию.

При необходимости, вы можете предотвратить чтобы представления (view) сохраняли свое состояние установив значение атрибута android:saveEnabled в false или же воспользовавшись методом setSaveEnabled(). Хотя обычно в этом нет необходимости, но все же у вас есть возможность сохранять состояние UI активности другим способом.

Примечание: Поскольку не гарантируется что метод onSaveInstanceState() будет вызван, вы должны использовать его только для сохранения временных данных состояния UI Активности и ни когда не использовать его для сохранения постоянных данных. Вместо него вы должны использовать метод onPause() для сохранения постоянных данных, если это необходимо, кода пользователь покидает Активность.

В следующей части будет немного практики на эту тему.

Комментариев нет:

Отправить комментарий