Документ Android говорит:
«Когда система, а не пользователь, закрывает действие для экономии памяти,…»
Но как смоделировать эту ситуацию? Хочу отладить метод onRestoreInstanceState(Bundle)
, но не знаю как.
Документ Android говорит:
«Когда система, а не пользователь, закрывает действие для экономии памяти,…»
Но как смоделировать эту ситуацию? Хочу отладить метод onRestoreInstanceState(Bundle)
, но не знаю как.
Вы не можете сделать это автоматически, потому что это совершенно недетерминировано.
Подробнее см. мой ответ здесь: https://stackoverflow.com/a/15048112/909956.
Но хорошая новость заключается в том, что все, что вам нужно сделать, это просто имитировать вызов onSaveInstanceState, и вы косвенно тестируете эту ситуацию с нехваткой памяти.
onSaveInstanceState может быть вызван:
Я использовал параметр разработчика «Не сохранять действия», чтобы воспроизвести сбой, который произошел, когда действие было уничтожено из-за нехватки памяти. Вы можете найти его в разделе Apps
страницы Settings->Developer Options
.
Он уничтожает все действия, как только вы выходите из него. Например. если вы нажмете домой, чтобы перевести приложение в фоновый режим, текущая активность будет уничтожена. См. https://stackoverflow.com/a/22402360/2833126 для получения дополнительной информации.
Есть два способа смоделировать процесс уничтожения 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() из вашего конструктора помогает, он зависает ваше приложение, пока не будет подключен отладчик),
поставить ваше приложение в какое-то состояние,
убить его из Настройки->Приложения,
случайно переключитесь на него через кнопку «Последние приложения» (оно все равно будет в списке),
в этот момент ваше приложение будет запущено заново и onRestoreInstanceState будет немедленно вызвано в верхней активности.
Хорошие ответы здесь.
Теперь, находясь в отдаленном будущем, использование Instant Run в Android Studio также вызовет сохранение и восстановление при перезапуске действий с изменениями кода.
Для этого есть достойное решение в Android 6 и новее. См. мой ответ здесь: Имитация уничтожения активности в эмуляторе