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

Android уничтожает деятельность, убивает процессы

Привет, мне интересно, как Android управляет памятью, и я не могу найти точный ответ в любом месте. Предположим, что у меня есть приложение с 5 действиями в текущем стеке активности (4 остановлены и 1 возобновлено), никакой сервис не подключен. Я нажимаю кнопку HOME, чтобы все мои действия были остановлены. Я запускаю какое-то другое приложение для работы с памятью, а общая память устройства начинает оставаться низкой. И вопрос:

... Что будет с моим приложением?

  • Может ли система уничтожить только одну или некоторые из моих действий для восстановления памяти?
  • Будет ли система удалять весь процесс моего приложения? Будут ли все мероприятия уничтожены?
  • Что произойдет, когда я вернусь к моему приложению, когда он будет полностью убит? Будет ли он начинаться с начала (например, с первого запуска) или он попытается восстановить действия в предвзятое состояние/если да - это только тот, который находится на вершине стека или все из них?

UPDATE:

Прежде чем задать этот вопрос, я несколько раз видел жизненный цикл Activity, но у меня нет ответов на мои вопросы. Я провел несколько тестов, и у меня есть ответы. "Стоп-процесс" в DDMS был ключом к тестированию.

Я не тестировал ответ на вопрос 1, но в качестве руководства говорится:

Если действие приостановлено или остановлено, система может отбросить активность из памяти, либо попросив ее закончить, либо просто убив ее процесс.

Кажется, что один или несколько действий могут быть уничтожены мягко (с помощью метода onDestroy), не убивая процесс. Когда вы вернетесь к ним, вы просто получите (onCreate + bundle).

Вопрос 2:

ДА. Как правило, система убивает весь процесс, это означает, что все данные, включая действия и статические поля, уничтожаются. Это НЕ сделано красиво - вы не получите onDestroy или finialize() для любого из ваших приостановленных/остановленных действий. Вот почему saveInstanceState() вызывается непосредственно перед методом onPause. onPause - это в основном последний метод, когда вы должны что-то сэкономить, потому что после этого метода вы никогда не сможете увидеть onStop или onDestroy. Система может просто убить процесс, уничтожающий все ваши объекты, что бы они ни держали, и что бы они ни делали.

Вопрос 3:

Что произойдет, когда вы вернетесь в убитое приложение?

  • До Android 2.2 - приложение начнет с начала, с активацией запуска.
  • Начиная с версии 2.2 - система восстановит предыдущее состояние приложения. Что это значит? Это означает, что последняя видимая активность будет воссоздана (onCreate + bundle). Что произойдет с стеком активности? Стек в порядке, но все действия на нем мертвы. Каждый из них будет воссоздан (onCreate + bundle), когда вы вернетесь к нему с помощью кнопки "Назад". В этом есть еще одна вещь:

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

Заключение

  • Не думайте, что проблемы с вращением рабочего процесса могут быть решены by android: configChanges = "ориентация". Когда вы это сделаете, вы получить много других проблем, о которых вы даже не подозреваете.
  • Протестируйте приложение с помощью кнопки DDMS - Stop. См. это
  • Будьте осторожны при использовании статических переменных. Не думайте, что когда вы инициализировали их в действии 1, вы инициализируете их в действии 2. Единственным безопасным местом для инициализации глобальной статики будет класс Application.
  • Помните, что вы никогда не увидите onStop или onDestroy. Закройте файлы/базы данных, остановите загрузчики в onPause. Если вы хотите, чтобы приложение что-то делало в BG, используйте службу переднего плана.

Это было бы так... Надеюсь, я помог с моим эссе:)

4b9b3361

Ответ 1

Сначала, пожалуйста, взгляните на это:

img1

onPause() Вызывается, когда система вот-вот начнет возобновление предыдущей деятельности. Обычно это используется для передачи несохраненных изменений в постоянные данные, остановки анимации и другие вещи, которые могут быть потребляющий процессор и т.д. Реализации этого метода должны быть очень быстрыми потому что следующее действие не будет возобновлено до тех пор, пока этот метод возвращается. За ним следует либо onResume(), если активность возвращается обратно фронт или onStop(), если он становится невидимым для пользователя.

onStop() Вызывается, когда действие больше не отображается пользователю, поскольку другое действие возобновлено и охватывает это один. Это может произойти либо потому, что начинается новое действие, перед этим вставлен существующий, или этот уничтожается. За ним следует либо onRestart(), если это действие вернуться к взаимодействию с пользователем или onDestroy(), если это действие уходит.

Итак, когда вы нажимаете кнопку "HOME" на своем устройстве, текущая активность переднего плана помещается на onPause(), затем onStop(), остальные 4 должны оставаться onStop()

В соответствии с документами Google:

  • Если активность на переднем плане экрана (вверху стека) активна или работает.
  • Если действие потеряло фокус, но все еще видимо (то есть, новая не полноразмерная или прозрачная деятельность фокусируется на верхней части вашего активности), он приостановлен. Остановленная деятельность полностью жива (она хранит всю информацию о штатах и ​​членах и остается прикрепленной к оконный менеджер), но может быть убит системой в крайне низкой памяти ситуации.
  • Если действие полностью закрыто другой деятельностью, оно прекращается. Тем не менее, он по-прежнему сохраняет всю информацию о государстве и членстве, он больше не отображается пользователю, поэтому его окно скрыто, и оно часто будут убиты системой, когда требуется память в другом месте.
  • Если действие приостановлено или остановлено, система может отбросить активность из памяти, попросив ее закончить или просто убить его процесс. Когда он снова отображается пользователю, он должен быть полностью перезапущен и восстановлен до прежнего состояния.

И для жизненного цикла процесса:

Жизненный цикл процесса. 3. Фоновая активность (активность, которая не видна пользователю и была приостановлена) больше не является критичной, поэтому система может безопасно убить свой процесс, чтобы вернуть память для других переднего плана или видимых процессов. Если его процесс должен быть убит, когда пользователь переходит к активности (делая его видимым на экран снова), его метод onCreate (Bundle) будет вызываться с помощью savedInstanceState, ранее предоставленный в onSaveInstanceState (Bundle), чтобы он мог перезапустить себя в том же когда пользователь последний раз оставил его.

Все приведенные выше цитаты взяты из: Справка для разработчиков Android: активность

Подтверждено, что система может уничтожать неактивные действия и перезаписывать память при запуске приложений с большим объемом памяти. И вы можете реализовать как: isFinishing() в своей деятельности, а затем использовать кнопку "kill" в DDMS, чтобы определить, какая из ваших действий удаляется системой. Но я думаю, что система сначала уничтожит самый старый. Однако не следует продолжать другие действия, когда "Запускная деятельность" была переработана.

UPDATE

Вот некоторые мнения, которые я нашел из здесь:

Остановленное состояние

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

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

Остановленные действия могут быть удалены из памяти в любой точке.

Ответ 2

Может ли система уничтожить только один или несколько моих действий для восстановления память?

Да. Android убивает действия, которые работают в фоновом режиме, когда есть необходимость в памяти. Убивание одного или всех может зависеть от некоторых условий. Для приостановленного или остановленного экземпляра может андроид убить действие или сам процесс. Здесь в разделе Жизненный цикл деятельности вы можете получить следующие пункты. Я рекомендую вам полностью пройти эту страницу. Это определенно прояснит ваши сомнения.

Если активность потеряла фокус, но все еще видна (т.е. новая не полноразмерная или прозрачная деятельность фокусируется на активности), он приостановлен. Остановленная деятельность полностью жива (она хранит всю информацию о штатах и ​​членах и остается прикрепленной к оконный менеджер), но может быть убит системой в крайне низкой памяти ситуации.

Если действие полностью закрыто другой деятельностью, он остановлен. Он по-прежнему сохраняет всю информацию о штатах и ​​членах, однако он больше не виден пользователю, поэтому его окно скрыто и он часто будет убит системой, когда потребуется память в другом месте.

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


Будет ли система удалять весь процесс моего приложения? Будет ли все мероприятия будут хорошо уничтожены?

Деятельность относится к индивидууму, тогда как процесс относится к группе видов деятельности. Посмотрите на третий пункт выше, он убивает процесс, как упоминалось.


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

Аналогично перезапуску. Снова третий пункт даст вам несколько ответов, например When it is displayed again to the user, it must be completely restarted and restored to its previous state

Получить дополнительную информацию о материалах, связанных с памятью здесь.

Edit:
Все действия в приложении выполняются в одном процессе. Поэтому, когда процесс убит, все действия, которые не имеют значения 5 или 10, будут убиты, то есть перезапущены. Перезапуск приведет к тому, что ваше приложение начнет с начала никаких сохраненных состояний.