Привет, мне интересно, как 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, используйте службу переднего плана.
Это было бы так... Надеюсь, я помог с моим эссе:)