Android убьет процесс, если он находится в фоновом режиме, а ОС решит, что ему нужны ресурсы (оперативная память, процессор и т. Д.). Мне нужно иметь возможность смоделировать это поведение во время тестирования, чтобы убедиться, что мое приложение работает правильно. Я хочу быть в состоянии сделать это в автоматическом режиме, чтобы я мог проверить, правильно ли приложение ведет себя, когда это происходит, что означает, что мне придется проверять это в каждом действии и т. Д.
Я знаю, как убить мой процесс. Это не проблема. Проблема заключается в том, что когда я убиваю мой процесс ( с использованием DDMS, adb shell kill
, Process.killProcess()
и т.д.) Android не перезапускает его таким же образом , что это будет , если Android OS убившую его сам.
Если ОС Android убивает процесс (из-за требований к ресурсам), когда пользователь возвращается в приложение, Android воссоздает процесс, а затем воссоздает верхнюю активность в стеке активности (вызов onCreate()
).
С другой стороны, если я убиваю процесс, Android предполагает, что активность в верхней части стека активности велась плохо , поэтому он автоматически воссоздает процесс, а затем удаляет верхнюю активность из стека активности и воссоздает действие, находившееся под ним. верхняя активность (вызывая onCreate () `). Это не то поведение, которое я хочу. Я хочу такое же поведение, как когда Android убивает процесс.
Просто для иллюстрации, если мой стек активности выглядит так:
ActivityA -> ActivityB -> ActivityC -> ActivityD
Если Android убивает процесс и пользователь возвращается в приложение, Android заново создает процесс и создает ActivityD.
Если я убью процесс, Android воссоздает процесс и создает ActivityC.
Ответы:
Лучший способ проверить это для меня:
Terminate Application
в окне Logcat в Android Studio (это убьет процесс приложения, убедитесь, что вы выбрали свое устройство и процесс в раскрывающихся списках Logcat вверху)На некоторых устройствах вы также можете вернуться к приложению (ActivityD) с помощью Приложения -> Значок запуска, но на других устройствах вместо этого будет запускаться ActivityA.
Вот что говорят об этом Android-документы:
источник
<activity>
теге в манифесте.Кажется, это работает для меня:
Это отличается от
adb shell kill
упомянутого ФП.Обратите внимание, что справка для
am kill
команды говорит:Таким образом, он не убьет процесс, если он находится на переднем плане. Кажется, это работает так, как того хотел ОП, потому что, если я отойду от своего приложения, а затем запустлю
adb shell am kill <package_name>
его, приложение будет убито (я подтвердил это, используяps
устройство). Затем, если я вернусь в приложение, то вернусь к деятельности, в которой я был ранее - то есть в примере с OP процесс воссоздается и создается ActivityD (а не ActivityC, как кажется, срабатывают большинство других методов убийства).Извините, я опоздал на пару лет на OP, но, надеюсь, другие найдут это полезным.
источник
adb shell am force-stop
. Последний также удалит все отложенные объекты, связанные с вашим приложением (например, уведомления), а первый - нет.am kill
.ps
показывает мое приложениеДругой метод, вероятно, сценарий, так как он не требует DDMS:
Однократная настройка: перейдите в «Параметры разработчика», выберите «Настройка предела фоновых процессов», измените значение со «Стандартный лимит» на «Без фоновых процессов».
Когда вам нужно перезапустить процесс, нажмите кнопку домой. Процесс будет убит (вы можете проверить в logcat / Android Monitor в студии - процесс будет помечен [DEAD]). Затем вернитесь в приложение с помощью переключателя задач.
источник
Этот вопрос старый, но есть ответ на этот вопрос, который не требует adb, Android Studio и т. Д. Единственное требование - API 23 или более поздняя версия.
Чтобы имитировать перезапуск приложения ОС, перейдите в настройки приложения во время его работы, отключите (затем вы можете включить) разрешение и верните приложение из последних приложений. Когда разрешение отключено, ОС убивает приложение, но сохраняет сохраненные состояния экземпляра. Когда пользователь возвращает приложение, приложение и последнее действие (с сохраненным состоянием) воссоздаются.
Метод «без фоновых процессов» иногда вызывает такое же поведение, но не всегда. Например, если приложение запускает фоновую службу, «Нет фоновых процессов» ничего не делает. Но приложение может быть убито системой, включая ее сервисы. Метод разрешения работает, даже если приложение имеет сервис.
Пример:
Наше приложение имеет два вида деятельности. ActivityA - это основное действие, которое запускается с панели запуска. ActivityB запускается из ActivityA. Я покажу только методы onCreate, onStart, onStop, onDestroy. Android всегда вызывает onSaveInstanceState перед вызовом onStop, поскольку активность, находящаяся в состоянии остановки, может быть прервана системой. [ https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle]
Метод разрешения:
Я хочу сравнить другие методы, которые упоминаются в других ответах.
Не сохранять активность: это не убивает приложение.
Метод принудительной остановки: не сохраняет сохраненные состояния экземпляра
источник
Service
убитый много раз. Даже если в системе недостаточно памяти. Большинство производителей устройств написали свои собственные «оптимизации» и «улучшения» для ОС Android с целью экономии заряда батареи. Многие устройства имеют гораздо более агрессивных «убийц», чем стандартный Android.Я очень опоздал на вечеринку, и несколько человек до меня дали тот же правильный ответ, но для упрощения для тех, кто придет за мной, просто нажмите кнопку «Домой» и выполните команду:
adb shell ps | grep <package name> | awk '{print $2}' | xargs adb shell run-as <package name again> kill
Приложение не потеряет свое состояние, и, по моему собственному опыту, оно работает так же, как ОС убивало приложение в фоновом режиме. Это работает только для отладки встроенных приложений
источник
'grep' is not recognized as an internal or external command, operable program or batch file.
run-as <package name> kill 7379
, но это поставило меня на предыдущее действие, а не на то, на котором я был, когда нажимал кнопку «Домой».Вот как вы делаете это в Android Studio.
источник
Android Monitor - Monitors
. Должно быть что-то, от чего они избавились. Я на v 3.2.1Поместите приложение в фоновом режиме с помощью кнопки HOME
Выберите свой процесс в режиме «Logcat» в Android Studio, затем нажмите «Завершить приложение» в нижнем левом углу.
Теперь запустите ваше приложение из панели запуска на устройстве Android
РЕДАКТИРОВАТЬ: Согласно Интернету, следующее также работает:
РЕДАКТИРОВАТЬ из будущего: кое-что отметить, в Android Studio 4.0 произошли изменения, если вы используете
Run
из AS, тоTerminate
выдастForce Stop
.Тем не менее, если вы запустите его после запуска, а затем попытаетесь смоделировать его таким образом, вы получите желаемый результат (нехватка памяти).
источник
the behaviour is not the same as what happens when Android kills the process
да, это такВы можете сделать следующие шаги для воспроизведения искомого поведения:
источник
В параметрах разработчика в разделе «Настройки» выберите «Не сохранять действия», что приведет к уничтожению действий, как только вы отойдете от них.
Примечание. Согласно приведенному ниже полезному комментарию, используйте его только в том случае, если вам не нужны очищаемые статические значения.
источник
Нажмите кнопку «Домой» и сначала поместите приложение в фоновом режиме. Затем остановите или убейте процесс из DDMS или ADB.
источник
Вы также можете подключиться к своему устройству / эмулятору через терминал
adb shell
, затем получить PID вашего процессаps | grep <your_package_name
и выполнитьkill -9 <pid>
. Затем откройте свернутое приложение из средства выбора последних приложений, и оно перезапустит последнее действиеисточник
Корень вашей проблемы, кажется, в том, что ваш
Activity
находитесь на переднем плане, когда вы убиваете процесс.Вы можете наблюдать это, нажав Стоп в DDMS, когда
Activity
он виден (происходит именно то, что вы описали) и сравнив это с нажатием «Стоп» после возвращения домой и последующего возврата в приложение.Просто убедитесь, что
moveTaskToBack(true)
как-то в ваших тестах.источник
Я не уверен, что это ответ, который вы ищете, это больше похоже на логическую мысль.
Я не думаю, что вы действительно можете сделать полностью автоматизированный тест, единственный способ имитировать его, это будет воссоздать его, у АКА так много действий, что Android убьет ваше приложение.
Поэтому моя идея или предложение - сделать еще одно небольшое приложение, которое будет отображать новые действия, пока Android не исчерпает память и не начнет обрабатывать его в фоновом режиме.
Что-то среди линии:
Запустить действие i -> Проверить запущенный процесс, если приложение находится в списке, увеличить i и перезапустить цикл, не закрывая текущее действие, иначе -> уменьшить i и закрыть текущее действие, вернуться к предыдущему и перепроверить ...
источник
Когда процесс приложения умирает, Android просматривает записи действий (записи представляют действия в стеке истории) и решает какие из них оставить в истории, а какие удалить из нее.
Одним из ключевых моментов здесь является
ActivityRecord
поле под названиемhaveState
, которое инженеры Android Framework описывают как «мы получили последнее состояние активности?».По умолчанию Android считает, что активность имеет состояние. Действие становится не сохраняющим состояние, когда приложение сообщает службе диспетчера задач о том, что действие возобновлено, и это действует, пока приложение не уведомит платформу о том, что действие перешло в состояние Остановлено. Проще говоря,
haveState
значениеfalse
между активностьюonResume()
вызывается иonStop()
илиonSaveInstanceState()
вызывается в зависимости от целевой версии приложения.В этом случае ActivityD не имеет
android:stateNotNeeded="true"
атрибута в манифесте приложения, и в настоящее время он работает на переднем плане, поэтому Android удаляет его из истории, так как система не получила свое последнее состояние.Как уже упоминалось несколько раз, вы можете просто переместить приложение в фоновый режим, чтобы верхняя активность в заднем стеке активности сохранила свое состояние, и после этого вы можете завершить процесс приложения через Android Debug Bridge, Android Studio или используя Свойство «Фоновые процессы» в параметрах разработчика. После этого ваша недавняя активность будет успешно воссоздана.
Несмотря на это, есть еще один простой способ проверить сценарий смерти процесса приложения. Зная все вышеописанное и тот факт, что если вы запустите новый ActivityE из текущего запущенного ActivityD, то
onStop()
обратный вызов ActivityD вызывается только послеonResume()
метода ActivityE , вы можете выполнить следующий трюк.Тогда просто начни
TerminatorActivity
когда хотите убить приложение.Наконец, есть легкий инструмент, который упрощает тестирование смерти вашего приложения, называется Venom .
источник