В Android, в чем разница между запущенными процессами и кешированными фоновыми процессами?

На Android, когда я смотрю в "Настройки" -> "Приложение", на вкладке "Работает", я вижу, что память разрезана на части: "использованная память" и "память свободна", также приложения либо ставятся в «используемую память» или «свободную память». Приложения в части «свободная память» отмечены как «кэшированный фоновый процесс».

Итак, что такое «кэшированные фоновые процессы»? Они все еще находятся в памяти, а не переключаются на «диск» (как это делают настольные компьютеры/ноутбуки), верно? Когда пользователь открывает один из этих «кэшированных фоновых процессов», он будет отображаться немедленно, поскольку он все еще находится в памяти, точно так же, как запущенный процесс, верно?

Что делает Android, когда «кэширует» приложение?


person JackWM    schedule 10.01.2013    source источник


Ответы (3)


Итак, что такое «кэшированные фоновые процессы»?

Поскольку вы запрашиваете техническую интерпретацию чего-либо, указанного в пользовательском интерфейсе устройства, определение может различаться в зависимости от устройства, если производители устройств решили возиться с приложением «Настройки».

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

Выдающимся примером «кэшированного фонового процесса» может быть тот, когда пользователь запускает приложение, ненадолго ковыряется в нем, а затем нажимает ДОМОЙ, чтобы вернуться на главный экран. Если у процесса нет запущенной службы, я ожидаю, что он будет указан как «кэшированный фоновый процесс».

Они все еще находятся в памяти, а не переключаются на «диск» (как это делают настольные компьютеры/ноутбуки), верно?

Правильный. Устройства Android не используют пространство подкачки.

person CommonsWare    schedule 10.01.2013
comment
Хорошее объяснение! Я также заметил, что некоторые данные, используемые приложением, могут быть потеряны при кэшировании приложения. Например. Я посмотрел видео на Youbute, затем нажал кнопку «Домой», затем снова переключился на видео и обнаружил, что оно загружается с самого начала. Правильно ли это понимание? - person JackWM; 10.01.2013
comment
@JackWM: это зависит от приложения и от того, как оно было написано. - person CommonsWare; 10.01.2013
comment
Хорошо, вы имеете в виду, что это указано авторами приложения, верно? через функцию onPause()? Существуют ли какие-либо требования к размеру данных, которые приложение может поддерживать при кэшировании? - person JackWM; 10.01.2013
comment
@JackWM: Существуют ли какие-либо требования к размеру данных, которые приложение может поддерживать при кэшировании? -- ничем не отличается от того, когда он находится на переднем плане. Приложения могут сократить потребление памяти, когда они не находятся на переднем плане, и это может помочь им немного дольше работать, но ничего не требуется. Кроме того, ограничение размера кучи одинаково для процесса независимо от того, находится ли он на переднем плане или в фоновом режиме. - person CommonsWare; 10.01.2013
comment
Что вы имеете в виду, что устройства Android не используют пространство подкачки? Я думаю, что тот факт, что приложение может быть уничтожено при нехватке памяти, но может быть восстановлено с предыдущим состоянием, означает, что Android каким-то образом использует своп. Разве это не обмен? Система Android дает возможность сохранить текущее состояние и восстанавливает его, когда пользователь возвращается. - person 김준호; 30.04.2014
comment
Посоветуйте также статью Роберта Лава. blog.rlove.org/2010/04/ почему-ipad-and-iphone-dont-support.html - person 김준호; 30.04.2014
comment
@김준호: Что вы имеете в виду, что устройства Android не используют пространство подкачки? -- Устройства Android обычно не поставляются с разделом подкачки Linux или файлом подкачки. Разве это не обмен? -- подкачка обычно определяется как подкачка ОЗУ на диск. Вы можете определить своп, как вам нравится. - person CommonsWare; 30.04.2014
comment
@CommonsWare Хорошо, может быть, я неправильно понял. Тогда мне просто интересно, где Android сохраняет данные, когда фоновый процесс завершается? В статье Роберта говорится, что многозадачность возможна даже на устройстве с ограниченным объемом памяти и без подкачки. Не могли бы вы пролить свет на это? - person 김준호; 30.04.2014
comment
@김준호: Тогда мне просто интересно, где Android сохраняет данные, когда фоновый процесс завершается? -- сохраненное состояние экземпляра Bundle и т. д. хранится в основном процессе ОС. Это одна из причин, по которой Bundle может хранить только те данные, которые могут быть преобразованы в байтовые массивы для передачи через границы процесса. - person CommonsWare; 30.04.2014
comment
@CommonsWare Ага! Большое спасибо за то, что поделились! :) - person 김준호; 30.04.2014
comment
@CommonsWare: Мое приложение для Android не содержит никаких служб, поэтому, когда я нажимаю клавишу «Домой» и перехожу в «Приложения ==> фоновый процесс кэширования», мое приложение отображается в списке, но оно показывает от 400 до 500 МБ. Это слишком высоко, и это зависит от устройства. У меня всего 5-6 экранов в моем приложении. Как я могу уменьшить отображаемый объем памяти? Пожалуйста помоги. - person Manish Agrawal; 07.04.2015

Почему бы не просмотреть исходный код Setting.

В моем Nexus 4 «Настройки» -> «Приложение» -> «Запуск» выглядит так, как показано ниже.

введите здесь описание изображениявведите здесь описание изображения


Прежде чем приступить к работе, в иерархии важности Android Process есть пять уровней. Это

1) Активный процесс,
2) Видимый процесс,
3) Сервисный процесс,
4) Фоновый процесс,
5) Пустой процесс

Дополнительную информацию можно найти в документе "Processes and Threads" на сайте Android Developer< /а>.

Я изучил код, и оказалось, что "ПОКАЗАТЬ КЭШИРОВАННЫЕ ПРОЦЕССЫ" показывает те процессы, чья иерархия важности равна или ниже, чем "Фоновый процесс". С другой стороны, "ПОКАЗАТЬ РАБОТАЮЩИЕ СЛУЖБЫ" показывает те, иерархия важности которых равна "Видимый процесс" или выше. Я опустил некоторые детали, чтобы ясно показать главное. Вы можете увидеть полный исходный код этой части здесь.

try {
        final int numProc = mAllProcessItems.size();
        int[] pids = new int[numProc];
        for (int i=0; i<numProc; i++) {
            pids[i] = mAllProcessItems.get(i).mPid;
        }

        ...

        for (int i=0; i<pids.length; i++) {
            ProcessItem proc = mAllProcessItems.get(i);
            changed |= proc.updateSize(context, pss[i], mSequence);
            if (proc.mCurSeq == mSequence) {
                serviceProcessMemory += proc.mSize;
            } else if (proc.mRunningProcessInfo.importance >=
                    ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
                backgroundProcessMemory += proc.mSize;
                MergedItem mergedItem;
                if (newBackgroundItems != null) {
                    mergedItem = proc.mMergedItem = new MergedItem(proc.mUserId);
                    proc.mMergedItem.mProcess = proc;
                    diffUsers |= mergedItem.mUserId != mMyUserId;
                    newBackgroundItems.add(mergedItem);
                } else {
                   ...
                }

               ...

            } else if (proc.mRunningProcessInfo.importance <=
                    ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                foregroundProcessMemory += proc.mSize;
            }
        }
    } catch (RemoteException e) {
    }


Итак, возвращаясь к вашему вопросу,

Они все еще находятся в памяти, а не переключаются на «диск» (как это делают настольные компьютеры/ноутбуки), верно?

Да, они все еще находятся в памяти, но со временем системе Android может потребоваться удалить старые процессы, чтобы освободить память для новых или более важных процессов. Чтобы определить, какие процессы оставить, а какие убить, система помещает каждый процесс в «иерархию важности».

Когда пользователь открывает один из этих «кэшированных фоновых процессов», он будет отображаться немедленно, поскольку он все еще находится в памяти, точно так же, как запущенный процесс, верно?

Верно. Например, единственная причина поддерживать "пустой процесс" – улучшить время запуска при следующем запуске компонента.

Что делает Android, когда «кэширует» приложение?

Насколько я знаю, он просто не убивает процесс и сохраняет ресурсы, чтобы немедленно ответить пользователю, когда он/она вернется.

person 김준호    schedule 30.04.2014
comment
у меня есть более чистое приложение, которое освобождает кеш запущенного процесса, как у вас дела, можете ли вы сказать мне, как я могу найти размер кеша для процесса и освободить размер кеша? @Javatar @congliu - person Erum; 24.11.2014

Рейтинг процессов

Операционная система Android старается поддерживать работу приложения как можно дольше, но когда доступной памяти становится мало, она пытается освободить ресурсы в системе, убивая в первую очередь процессы с меньшей важностью.

Именно тогда на сцену выходит ранжирование процессов; Процессы Android ранжируются в следующих пяти категориях от более высокого приоритета до более низкого приоритета:

  • Процесс переднего плана: это процесс, в котором размещается действие или служба, с которой в данный момент взаимодействует пользователь: служба, запущенная на переднем плане, или служба, выполняющая обратные вызовы своего жизненного цикла.
  • Видимый процесс: это процесс, в котором размещено приостановленное действие или служба, связанная с видимым действием.
  • Сервисный процесс: это процесс, в котором размещается сервис, не связанный с видимой активностью.
  • Фоновый процесс: это процесс, в котором выполняется невидимое действие; все фоновые процессы сортируются по списку наименее недавно использованных (LRU), поэтому самые последние использовавшиеся процессы являются последними убитыми процессами, когда они
  • Пустой процесс. Этот процесс используется для кэширования неактивных компонентов Android и для улучшения времени запуска любого компонента.

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

Источник :

Асинхронное программирование Android — второе издание — Хелдер Васконселос — июль 2016 г.

person Community    schedule 26.10.2016