Привет, мне интересно, как Android управляет памятью, и я нигде не могу найти точного ответа. Предположим, у меня есть приложение с 5 действиями в текущем стеке действий (4 остановлены и 1 возобновлен), служба не подключена. Я нажимаю кнопку HOME, чтобы остановить все мои действия. Я запускаю другое приложение, потребляющее память, и общий объем памяти устройства начинает заканчиваться. И вопрос в том
... Что будет с моим приложением?
- Может ли система уничтожить только одно или несколько моих действий для восстановления памяти?
- Система убьет весь процесс моего приложения? Будет ли вся деятельность уничтожена?
- Что произойдет, когда я вернусь к своему приложению, когда оно было полностью убито? Будет ли он начинаться с самого начала (как при первом запуске) или будет пытаться восстановить действия до предыдущего состояния / если да, то только одно из них находится на вершине стека или все?
ОБНОВИТЬ:
Прежде чем задать этот вопрос, я несколько раз видел жизненный цикл Activity, но у него нет ответов на мои вопросы. Я сделал несколько тестов и у меня есть ответы. «Остановить процесс» в DDMS было ключом к тестированию.
Я не тестировал ответ на вопрос 1, но, как сказано в руководстве:
Если действие приостановлено или остановлено, система может удалить действие из памяти, либо попросив его завершить, либо просто завершив его процесс.
Кажется, что одно или несколько действий можно аккуратно уничтожить (с помощью метода onDestroy), не прерывая процесс. Вы просто получите (onCreate + bundle), когда вернетесь к ним.
Ответ на вопрос 2:
ДА. Обычно система убивает весь процесс, это означает, что все данные, включая действия и статические поля, уничтожаются. Это НЕ сделано хорошо - вы не получите onDestroy или finialize () ни для одной из ваших приостановленных / остановленных операций. Вот почему saveInstanceState () вызывается непосредственно перед методом onPause. onPause - это, по сути, последний метод, в котором вы должны что-то сохранить, потому что после этого метода вы никогда не увидите onStop или onDestroy. Система может просто убить процесс, уничтожив все ваши объекты, что бы они ни держали и что бы они ни делали.
Вопрос 3 ответ:
Что будет, когда вы вернетесь к убитому приложению?
- До Android 2.2 - приложение будет запускаться с самого начала, с активностью запуска.
- Начиная с версии 2.2 - система восстановит предыдущее состояние приложения. Что это означает? Это означает, что будет воссоздано последнее видимое действие (пакет onCreate +). Что будет со стеком активности? Стек в порядке, но все действия на нем мертвы. Каждый из них будет воссоздан (пакет onCreate +), когда вы вернетесь к нему с помощью кнопки возврата. И еще кое-что:
Обычно система очищает задачу (удаляет все действия из стека над корневым действием) в определенных ситуациях, когда пользователь повторно выбирает эту задачу на главном экране. Обычно это делается, если пользователь не посещал задачу в течение определенного времени, например 30 минут.
Вывод?
- Не думайте, что проблемы с обработкой ротации действий можно решить с помощью android: configChanges = "Ориентация". Когда вы сделаете это, вы столкнетесь со многими другими проблемами, о которых даже не подозреваете.
- Протестируйте свое приложение с помощью DDMS - кнопка «Остановить процесс». Посмотри это
- Будьте осторожны при использовании статических переменных. Не думайте, что когда вы инициализируете их в действии 1 - они будут инициализированы в действии 2. Единственным безопасным местом для инициализации глобальной статики будет класс Application.
- Помните, что вы никогда не увидите onStop или onDestroy. Закройте файлы / базы данных, остановите загрузчиков в onPause. Если вы хотите, чтобы приложение что-то делало в BG - используйте службу переднего плана.
Вот и все ... Надеюсь, я помог с моим эссе :)