Intereting Posts
PreferenceActivity значок активной панели действий не вернется домой (в отличие от ET :) Создать селектор стилей Как создать исполняемый файл native (командной строки) для запуска на Android? Отображение адреса To, предварительно заполненного в намерении электронной почты? TileProvider использует локальную плиту Могу ли я включить multidex в сборку отладки Android? Синхронизация модели частичной базы данных с сервера на клиент Что не так с моим кодом – Уведомление – звук не вибрирует Почему Cordova / Phonegap добавляет 8 в мой код версии Android? Как заставить остановить Intent Service в процессе? В чем разница между представлением и активностью в развитии Android? Android Selector Drawable с VectorDrawables srcCompat Android: Как переопределить onBackPressed () в AlertDialog? Огромная задержка / отставание UDP с Android Отправка электронной почты на Android с использованием API JavaMail без использования стандартного / встроенного приложения

Гранулярность управления памятью Android – активность или процесс?

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

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

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

На страницах разработчиков Android о воссоздании активности говорится:

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

Обратите внимание на двусмысленность: «система должна отключить фоновые процессы ».

На страницах Android Developer для onSaveInstanceState говорится:

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

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

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

Solutions Collecting From Web of "Гранулярность управления памятью Android – активность или процесс?"

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

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

Это все еще правильно.

На страницах разработчиков Android на тему «Восстанавливать активность» говорится …

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

На страницах Android Developer для onSaveInstanceState говорится:

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

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

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

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

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

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

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