Почему бы не просмотреть исходный код Setting.
В моем Nexus 4 «Настройки» -> «Приложение» -> «Запуск» выглядит так, как показано ниже.
![введите здесь описание изображения](https://i.stack.imgur.com/QZROb.png)
![введите здесь описание изображения](https://i.stack.imgur.com/HH4Rp.png )
Прежде чем приступить к работе, в иерархии важности 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