Подтвердить что ты не робот

Имитировать убийство активности в эмуляторе

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

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

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

Надеюсь, я поняла. Благодаря

4b9b3361

Ответ 1

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

Если вы не хотите пытаться найти pid процесса вашего приложения, вы можете использовать adb shell am kill com.example.package_name, чтобы убить процесс вашего приложения. Убедитесь, что приложение находится в фоновом режиме. В документах говорится, что эта команда "убивает только те процессы, которые безопасны для уничтожения и которые не повлияют на работу пользователя". Таким образом, вы можете запустить несколько других приложений, прежде чем пытаться это.

Ответ 2

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

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

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

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

Ответ 3

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

1) Откройте приложение, перейдите к действию, которое вы хотите протестировать, и оставьте его, нажав кнопку "Главная"

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

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

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

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

Ответ 4

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

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

enter image description here

Ответ 5

Давайте уточним ваш вопрос.

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

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

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

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

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

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

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

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

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

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

Ответ 6

От android doc, http://developer.android.com/reference/android/content/ComponentCallbacks.html#onLowMemory()

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

Ответ 7

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

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

android:configChanges="orientation"