Как симулировать убийственную деятельность, чтобы сохранить память? - PullRequest
32 голосов
/ 01 марта 2010

Android док скажет:

"Когда система, а не пользователь, закрывает действие для сохранения памяти, ..."

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

Ответы [ 8 ]

32 голосов
/ 24 февраля 2013

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

Смотрите мой ответ здесь: https://stackoverflow.com/a/15048112/909956 для деталей.

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

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

  1. потеря фокуса (нажатием кнопки home, которая, по сути, похожа на переключение с вашего приложения на приложение запуска), запуском другого действия, нажатием последних
  2. изменение ориентации. это проще, если вы используете эмулятор
  3. изменение настроек разработчика: перейти к настройкам разработчика -> Приложения -> Не сохранять действия. Это лучший вариант, если вы временно тестируете на реальном устройстве.
16 голосов
/ 06 марта 2015

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

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

11 голосов
/ 22 июня 2016

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

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

enter image description here

8 голосов
/ 01 марта 2010

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

4 голосов
/ 03 июля 2014

Для отладки onRestoreInstanceState вы можете сделать следующее:

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

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

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

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

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

4 голосов
/ 24 декабря 2011

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

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

См. Ссылку ниже для более подробной информации: http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

1 голос
/ 12 мая 2017

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

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

0 голосов
/ 16 сентября 2017

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

...