Привет, мне интересно, как 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 - используйте службу переднего плана.
Вот и все ... Надеюсь, я помог с моим эссе :)
источник
Ответы:
Сначала взгляните на это:
Таким образом, при нажатии кнопки «HOME» на устройстве, текущая активность переднего плана ставится на
onPause()
тоonStop()
, другой 4 должен оставатьсяonStop()
Согласно документам Google:
И для жизненного цикла процесса:
Все приведенные выше цитаты взяты из: Справочник разработчиков Android: Activity
Подтверждено, что система может уничтожать неактивные действия и повторно использовать память, когда вы запускаете некоторые приложения, потребляющие память. И вы можете реализовать что-то вроде:
isFinishing()
в своей деятельности, а затем с помощью кнопки «убить» в DDMS, чтобы определить, какие из ваших действий удаляются системой. Но я думаю, что система сначала уничтожит самую старую. Однако нет смысла продолжать другие действия после повторного использования «Действия запуска».ОБНОВИТЬ
Вот несколько мнений, которые я нашел отсюда :
источник
Да. Android убивает действия, выполняемые в фоновом режиме, когда требуется память. Убийство одного или всех может зависеть от некоторых условий. Например, приостановленный или остановленный экземпляр может заставить Android убить действие или сам процесс. Здесь, в разделе « Жизненный цикл активности», вы можете получить следующие баллы. Я рекомендую вам полностью просмотреть эту страницу. Это обязательно развеет ваши сомнения.
Деятельность относится к отдельному человеку, тогда как процесс относится к группе действий. Посмотрите на третий пункт выше, он убивает упомянутый процесс.
Это похоже на перезагрузку. Опять же, третий пункт даст вам несколько ответов, например
When it is displayed again to the user, it must be completely restarted and restored to its previous state
Получить более подробную информацию о памяти , связанном питании здесь .
Изменить:
все действия в приложении выполняются в одном процессе. Таким образом, когда процесс завершается, все действия, независимо от 5 или 10, будут остановлены, то есть перезапущены. Перезагрузка приведет к тому, что ваше приложение запустится с самого начала без сохраненных состояний.
источник