7

Я вижу противоречивую документацию и дискуссию о том, что происходит, когда Android неактивен в памяти и шаги, предпринимаемые операционной системой для повторной заявки на память. В частности, удаляет ли Android при детализации активности/фрагмента или всего процесса?Зеркальность управления памятью Android - активность или процесс?

Например, если активность B запускается перед активностью A (и оба действия являются частью одного и того же приложения/процесса), может ли операция A быть убита ОС, а действие B - на переднем плане, а пользователь - взаимодействуя с Activity B (предположим: экран остается включенным, текущее приложение остается на переднем плане, не происходит изменения ориентации)?

Этот SO answer с 2011 года (от Dianne Hackborn от команды Android в Google) предполагает, что Android убивает зернистость процесса, а не активность.

На Android страницы разработчика на Recreating an Activity, он говорит:

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

Обратите внимание на двусмысленность: «система должна закрыть фоновые ПРОЦЕССЫ».

На Android страницы разработчика для onSaveInstanceState, он говорит:

Например, если активность B запускается перед активности А, и в какой-то точке активности А убивают, чтобы вернуть ресурсы, деятельность Завещание имеют возможность сохранить текущее состояние своего пользовательского интерфейса с помощью этого метода

После прочтения этих и многих других страниц документов и онлайн-обсуждения неясно, каков правильный ответ.

У меня также есть тот же вопрос относительно фрагментов: Можно ли убить фоновый фрагмент из-за низкой памяти, без полного его уничтожения?

ответ

5

Управление памятью происходит на двух различных уровнях: через сбор мусора (рециркуляция объектов без ссылок) и на уровне процесса, как описано в this Android blog post. Существует нет концепции убийства только одного действия (помните: Android основан на Linux и Linux не имеет понятия о действиях или компонентах, просто процессы).

Этот ответ от 2011 года (от Dianne Hackborn от команды Android в Google) предполагает, что Android убивает зернистость процесса, а не активность.

Это все еще верно.

На Android разработчика страниц на Воссоздание деятельности, это говорит ...

Да, «фоновые процессы» он упоминает именно категория процесса как указано выше в блоге и the documentation. Это относится к ранее существовавшим действиям, но уже не является частью текущих процессов на переднем плане/видимости.

На Android страницы разработчика для onSaveInstanceState, он говорит:

Да, они обсуждают случай, когда вы запускаете действия из другого процесса (как, вероятно, когда вы используете implicit intents). В течение этого времени ваш процесс не является процессом переднего плана, и, следовательно, его можно убить, если слишком много сочетаний действий переднего плана + переднего плана.

У меня также есть тот же вопрос относительно фрагментов: Можно ли убить фоновый фрагмент из-за низкой памяти, без полного его уничтожения?

Нет, фрагменты не могут быть убиты из-за низкой памяти.

+0

Это имеет смысл. Я знаю, что Linux не имеет понятия о действиях, но я не был уверен, добавлен ли Android в способность убивать отдельные действия. Спасибо за разъяснения! –

0

Я бы ошибался на стороне руководства Android и документации (хотя, было бы здорово, если бы они были более ясны в документации по коду и SO-ответах). Из http://developer.android.com/guide/components/tasks-and-back-stack.html:

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

0

Это «Процесс», а не «Активность Android». Часть путаницы заключается в названии «ActivityManager», который выполняет часть анализа памяти, а также управляет интерфейсами Android-Activity. Тем не менее, LMK (убийца с низкой памятью) действительно ответственен за прекращение процессов на основе информации, предоставленной ActivityManager и другими системными интерфейсами.

Я нашел краткий анализ этого в разделе «Отношения между oom_adj и верхним значением процесса» в http://www.programering.com/a/MjNzADMwATE.html