Подтвердить что ты не робот

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

В Android, когда я смотрю в "Настройка" → "Приложение", под вкладкой "running" я вижу, что память разрезается на части: "используемая память" и "свободная память", а также приложения либо помещаются в "используемую память", либо "свободную память". Приложения в разделе "Свободная память" отмечены как "кэшированный фоновый процесс".

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

Почему бы не заглянуть в "Настройка" исходного кода приложения.

В моем Nexus 4 "Настройка" → "Приложение" → "Запуск" выглядит ниже.

enter image description hereenter image description here


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

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

Более подробную информацию вы можете найти в "Процессы и потоки" на сайте разработчика Android.

Я просмотрел код, и оказалось, что "SHOW CACHED PROCESSES" показывает те процессы , иерархия важности которых равна или ниже, чем "Фоновый процесс" . С другой стороны, "SHOW RUNNING SERVICES" показывает те , иерархия важности которых равна "видимый процесс" или выше. Я бросил некоторые детали, чтобы четко показать основную точку. Вы можете увидеть полный исходный код этой части здесь.

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 может потребоваться удалить старые процессы для восстановления памяти для новых или более важных процессов. Чтобы определить, какие процессы сохранить и что убить, система помещает каждый процесс в "иерархию важности".

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

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

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

AFAIK, он просто не убивает процесс и не позволяет ресурсам немедленно отвечать на Пользователь, когда он/она возвращается.

Ответ 3

Ранги процесса

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

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

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

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

Источник:

Асинхронное программирование на Android - второе издание - Helper Vasconcelos - июль 2016 года