Android doc:
"Когда система, а не пользователь, отключает активность для сохранения памяти,..."
Но как имитировать эту ситуацию? Я хочу отлаживать метод onRestoreInstanceState(Bundle)
, но не знаю, как это сделать.
Android doc:
"Когда система, а не пользователь, отключает активность для сохранения памяти,..."
Но как имитировать эту ситуацию? Я хочу отлаживать метод onRestoreInstanceState(Bundle)
, но не знаю, как это сделать.
Вы не можете сделать это автоматическим способом b/c, полностью не детерминированным.
Подробнее см. мой ответ здесь: fooobar.com/questions/97106/....
Но хорошая новость заключается в том, что все, что вам нужно сделать, это просто имитировать вызов onSaveInstanceState, и вы косвенно проверяете эту ситуацию с низкой памятью.
onSaveInstanceState может быть вызван:
Я использовал опцию разработчика "Не держу", чтобы воспроизвести крах, который произошел, когда активность была убита из-за давления памяти. Вы можете найти его в разделе Apps
Settings->Developer Options
.
Он уничтожает каждое действие, как только вы его покидаете. Например. если вы нажмете на дом, чтобы положить свое приложение в фоновом режиме, текущая активность будет уничтожена. Подробнее см. fooobar.com/questions/97122/....
Существует два способа моделирования процесса убийства Android: с помощью параметра "Не выполнять действия" в настройках разработчика или самостоятельно уничтожить процесс приложения.
Чтобы убить процесс, откройте действие, которое вы хотите протестировать, затем нажмите кнопку "домой", чтобы отправить приложение в фоновом режиме, а затем, используя DDMS в Android Studio (Android Device Monitor), выберите процесс, а затем остановить процесс (как видно на изображении ниже). Ваше приложение было убито. Теперь откройте приложение снова (доступ к списку открытых приложений). Теперь вы можете проверить убитое состояние.
Для отладки onRestoreInstanceState()
просто измените ориентацию экрана ([Ctrl] - [F11] в эмуляторе). Ваша активность будет уничтожена и воссоздана, и будет вызываться пара onSaveInstanceState()
/onRestoreInstanceState()
.
Используйте приложение SetAlwaysFinish (работает на реальном устройстве и в эмуляторе) или используйте приложение Google DevTools (работает только в эмуляторе).
Эти приложения используют скрытый параметр AlwaysFinish класса ActivityManagerNative для изменения поведения ОС и вызывают немедленную разгрузку каждого действия, как только он больше не находится на переднем плане. Это будет надежно запускать события onSaveInstanceState и onRestoreInstanceState.
Подробнее см. ссылку ниже: http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/
Чтобы отладить onRestoreInstanceState, вы можете сделать следующее:
убедитесь, что вы можете отлаживать приложение сразу после его запуска (вызов функции android.os.Debug.waitForDebugger() из вашего конструктора помогает, он зависает ваше приложение, пока не будет подключен отладчик),
поместите приложение в определенное состояние,
причинно убить его из настроек- > приложений,
причинно вернуться к нему с помощью кнопки Recent Apps (она все равно будет в списке),
в этот момент ваше приложение будет запущено заново, и onRestoreInstanceState будет немедленно вызван в верхнюю активность.
Хорошие ответы здесь.
Теперь, находясь в отдаленном будущем, использование Instant Run в Android Studio также инициирует сохранение и восстановление, когда действия перезапускаются с изменениями кода.
Там есть достойное решение для Android 6 и новее. См. Мой ответ здесь: Имитировать убийство активности в эмуляторе