Как имитировать деятельность по убийству, чтобы сохранить память?

Документ Android говорит:

«Когда система, а не пользователь, закрывает действие для экономии памяти,…»

Но как смоделировать эту ситуацию? Хочу отладить метод onRestoreInstanceState(Bundle), но не знаю как.


person L.J.W    schedule 01.03.2010    source источник


Ответы (8)


Вы не можете сделать это автоматически, потому что это совершенно недетерминировано.

Подробнее см. мой ответ здесь: https://stackoverflow.com/a/15048112/909956.

Но хорошая новость заключается в том, что все, что вам нужно сделать, это просто имитировать вызов onSaveInstanceState, и вы косвенно тестируете эту ситуацию с нехваткой памяти.

onSaveInstanceState может быть вызван:

  1. потеря фокуса (нажав домой, что по сути похоже на переключение с вашего приложения на приложение запуска), запуск другого действия, нажатие недавних
  2. изменение ориентации. это более простой способ, если вы используете эмулятор
  3. изменение настроек разработчика: перейдите к параметрам разработчика --> Приложения --> Не сохранять действия. Это лучший вариант, если вы временно тестируете реальное устройство.
person numan salati    schedule 24.02.2013

Я использовал параметр разработчика «Не сохранять действия», чтобы воспроизвести сбой, который произошел, когда действие было уничтожено из-за нехватки памяти. Вы можете найти его в разделе Apps страницы Settings->Developer Options.

Он уничтожает все действия, как только вы выходите из него. Например. если вы нажмете домой, чтобы перевести приложение в фоновый режим, текущая активность будет уничтожена. См. https://stackoverflow.com/a/22402360/2833126 для получения дополнительной информации.

person aschmied    schedule 05.03.2015
comment
Убивает активность. Хорошо. Не перезапускает приложение и перезагружается до последнего открытого действия — что нам действительно нужно проверить, чтобы проверить реальный сценарий. - person maxweber; 02.06.2015

Есть два способа смоделировать процесс уничтожения Android: с помощью параметра «Не сохранять действия» в настройках разработчика или самостоятельно убить процесс приложения.

Чтобы завершить процесс, откройте действие, которое хотите протестировать, затем нажмите кнопку «Домой», чтобы перевести приложение в фоновый режим, а затем с помощью DDMS в Android Studio (Android Device Monitor) выберите процесс и затем остановите процесс (как показано на изображении ниже). Ваше приложение было убито. Теперь снова откройте свое приложение (доступ к списку открытых приложений). Теперь вы можете протестировать убитое состояние.

введите описание изображения здесь

person heloisasim    schedule 22.06.2016
comment
Спасибо! Это также можно сделать в окне Android Monitor с помощью красной кнопки «Завершить приложение», следуя тому же процессу. - person Alexandre G; 25.01.2017
comment
Ничего себе, вы только что помогли мне воспроизвести кучу странных ошибок, которые всегда случались на устройствах клиентов и никогда на моих! Параметр «Не оставлять действия в одиночку» отличается от «убивания процесса». Он не воссоздает объект Application, поэтому действия, предполагающие информацию о глобальном состоянии, хранящемся в объекте Application, с большой вероятностью завершатся сбоем. - person jadkik94; 15.02.2017

Для отладки onRestoreInstanceState() просто измените ориентацию экрана ([Ctrl]-[F11] в эмуляторе). Ваша активность будет уничтожена и создана заново, и будет вызвана пара onSaveInstanceState()/onRestoreInstanceState().

person CommonsWare    schedule 01.03.2010
comment
Это не будет работать для приложений, которые контролируют ориентацию самостоятельно или имеют фиксированную ориентацию. - person gotube; 13.10.2014
comment
И как проверить на устройстве. В настоящее время не существует пригодного для использования эмулятора, поэтому тестирование необходимо проводить на реальном устройстве. Кроме того, изменение ориентации невозможно, если действие объявлено только портретным. - person f470071; 29.04.2017
comment
@ f470071: И как проверить на устройстве - поверните устройство. Или сменить локаль. Или измените масштаб шрифта на устройствах Android 4.0+. В настоящее время не существует пригодного для использования эмулятора, поэтому тестирование необходимо проводить на реальном устройстве — эмулятор Android SDK работает для многих разработчиков; другие используют Genymotion. - person CommonsWare; 29.04.2017
comment
Эмулятор Android SDK очень медленный. На Genymotion Службы Google Play не могут быть установлены. Вот почему тестирование является таким разочаровывающим испытанием. Вращающееся устройство недоступно, поскольку для действий задана фиксированная ориентация. - person f470071; 29.04.2017

Используйте приложение SetAlwaysFinish (работает на реальном устройстве и в эмуляторе) или приложение Google DevTools (работает только в эмуляторе).

Эти приложения используют скрытый параметр AlwaysFinish класса ActivityManagerNative, чтобы изменить поведение ОС и заставить ее немедленно выгружать каждое действие, как только оно перестает быть активным. Это надежно вызовет события onSaveInstanceState и onRestoreInstanceState.

Подробнее см. ссылку ниже: http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

person Theo    schedule 23.12.2011

Чтобы отладить onRestoreInstanceState, вы можете сделать следующее:

  • убедитесь, что вы можете отлаживать приложение сразу после его запуска (вызов android.os.Debug.waitForDebugger() из вашего конструктора помогает, он зависает ваше приложение, пока не будет подключен отладчик),

  • поставить ваше приложение в какое-то состояние,

  • убить его из Настройки->Приложения,

  • случайно переключитесь на него через кнопку «Последние приложения» (оно все равно будет в списке),

  • в этот момент ваше приложение будет запущено заново и onRestoreInstanceState будет немедленно вызвано в верхней активности.

person beefeather    schedule 03.07.2014

Хорошие ответы здесь.

Теперь, находясь в отдаленном будущем, использование Instant Run в Android Studio также вызовет сохранение и восстановление при перезапуске действий с изменениями кода.

person Johnny C    schedule 12.05.2017

Для этого есть достойное решение в Android 6 и новее. См. мой ответ здесь: Имитация уничтожения активности в эмуляторе

person Wookie    schedule 16.09.2017