Имитация убийства активности в эмуляторе - PullRequest
19 голосов
/ 13 марта 2011

Я хотел бы проверить onSaveInstanceState и onRestoreInstanceState для моего приложения на эмуляторе.

Я нашел это , в котором говорится, что мы могли бы смоделировать это во время изменения ориентации, но я храню некоторые из моих переменных на уровне приложения (подкласс android.app.Application), поэтому изменение ориентации делает не стирайте переменные.

Итак, мой вопрос: как я могу симулировать ситуацию с нехваткой памяти, таким образом убивая мою деятельность?

Надеюсь, я ясно дал понять. Спасибо

Ответы [ 7 ]

20 голосов
/ 13 марта 2011

Вы можете приостановить приложение (нажав кнопку «Домой», имитировать вызов, что угодно). Тогда убей процесс приложения через adb. Поскольку в документах говорится, что после возврата onPause () ваше приложение может быть удалено без какого-либо уведомления, это справедливый тест.

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

Для проверки событий onSaveInstanceState и onRestoreInstanceState вы можете использовать утилиту SetAlwaysFinish (см. Ссылку ниже). Для изменения поведения системы Android используется скрытый системный параметр «Всегда готово». С включенной опцией Always Finish ОС Android немедленно выгружает все действия, которые перемещаются из переднего плана в фон, вызывая событие onSaveInstanceState. Затем, когда системе снова требуется действие, она вынуждена перезагрузить ее, вызвав событие onRestoreInstanceState.

Преимущество этого метода по сравнению с уничтожением процесса состоит в том, что он проще и вы получаете более тонкий контроль (уровень активности, чем уровень процесса).

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

Функция Always Finish также присутствует в эмуляторе в приложении DevTools в разделе «Настройки разработки»> «Немедленное уничтожение действий». Однако приложение DevTools не работает вне эмулятора.

6 голосов
/ 14 сентября 2017

Для Android 6 и новее есть более надежное решение.Я успешно использовал следующий метод на Android 6, 7 и 8:

1) Откройте свое приложение, перейдите к активности, которую вы хотите проверить, чтобы восстановить, а затем выйдите из нее, нажав кнопку «Домой»

2) Откройте приложение «Настройки», перейдите в «Система» -> «Параметры разработчика», затем нажмите «Запущенные службы»

3) Нажмите «Показать кэшированные процессы» в правом верхнем углу, затем найдитеприложение в списке, нажмите на него, а затем нажмите кнопку «Стоп».

4) Используйте список последних приложений, чтобы вернуться в свое приложение.Он должен перезапустить все приложение по активности, из которой вы ранее его оставили.

Я обнаружил, что этого достаточно для полного уничтожения приложения, включая все компоненты делегата приложения и состояние собственного кода C / C ++, а затем протестируйте его перезапуск с сохраненным состоянием активности ... Это эффективно копирует то, что происходит, когда пользователь оставляет приложение на некоторое время, а затем система убивает его, чтобы сэкономить память, батарею или что-то еще.

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

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

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

enter image description here

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

Позволяет уточнить ваш вопрос.

Но прежде чем мы это сделаем, рассмотрим факт onSaveInstanceState - его вызывают по разным причинам, таким как:

  • изменение ориентации
  • переход от переднего плана к фону (щелкнув домой или запустив другое занятие или нажав последние)
  • Система находится под недостатком памяти

Теперь, если ваш вопрос «как я могу имитировать вызов onSaveInstance только для целей тестирования», ответ Тео и Теда верен. Изменение параметра настроек разработчика или нажатие home приведет к вызову onSaveInstance.

Но так же, как и просто изменение ориентации (как вы отметили в своем вопросе) - что наводит меня на мысль, что вы можете спросить: «Как я могу симулировать вызов метода onSaveInstance, когда система находится под низким давлением памяти»

Краткий ответ на этот вопрос: нет автоматизированного способа симуляции состояния нехватки памяти. Вышеупомянутые методы только моделируют вызов метода onSaveInstanceState, а не нехватки памяти как таковой

Несколько предостережений здесь.

Первое предостережение об этом заключается в том, что в экстремальных условиях ядро ​​«нечисто» убьет ваш процесс, чтобы потребовать память - это означает, что onSaveInstanceState никогда не будет вызываться. В этих ситуациях тестирование onSaveInstanceState является спорным. С этим сценарием мало что можно поделать, но хорошая новость в том, что это очень редкое событие, особенно. для переднего плана деятельности.

Вторым предупреждением является то, что ActivityManager может вернуть ресурс вашей деятельности, «просто убив его», то есть будет вызван ваш onSaveInstance. Это происходит с действиями, которые не находятся на переднем плане (то есть не видны пользователю, поэтому уже находятся в остановленном состоянии), и система находится под давлением памяти.

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

Здесь важно помнить, что нет необходимости имитировать состояние с низким объемом памяти. Пока вы имитируете, как вызывается onSaveInstanceState, вы автоматически тестируете условие, где он может вызываться для ситуаций нехватки памяти. И самый простой способ вызвать этот метод - изменить ориентацию на эмуляторе (ctrl-f11). И если вы используете реальное устройство для временного изменения настроек разработчика («Не сохранять действия»)

0 голосов
/ 28 мая 2015

Самое простое решение, которое работает для меня, это просто изменить ориентацию устройства (вы можете сделать это независимо от того, используете ли вы AVD, Genymotion или любой другой эмулятор).По умолчанию система воссоздает Activity, вызывая onDestory, а затем onCreate.

Убедитесь, что Activity не имеет определенного ниже атрибута на AndroidManifest.xml

android:configChanges="orientation"
0 голосов
/ 13 марта 2011

Из документа Android, http://developer.android.com/reference/android/content/ComponentCallbacks.html#onLowMemory()

Это запускается системой.Я думаю, что вы можете установить размер оперативной памяти устройства меньше при создании виртуального устройства Android.(В разделе «Оборудование» выберите «Размер памяти устройства»)

...