在Android上,运行进程和缓存后台进程之间的区别是什么?

Jac*_*kWM 27 android background-process

在Android上,当我查看"设置" - >"应用程序"时,在"运行"选项卡下,我可以看到内存被切入到部分:"已用内存"和"无内存",应用程序也被放入进入"二手记忆",或"无记忆"."无内存"部分中的应用程序被标记为"缓存后台进程".

那么,什么是"缓存后台进程"?它们仍然在内存中,而不是切换到"磁盘"(就像台式机/笔记本电脑那样),对吧?当用户选中其中一个"缓存的后台进程"时,它会立即显示,因为它仍在内存中,就像正在运行的进程一样,对吧?

Android在"缓存"应用程序时会做什么?

Com*_*are 45

那么,什么是"缓存后台进程"?

由于您要求对设备UI中列出的内容进行技术解释,因此如果设备制造商选择修改"设置"应用,则定义可能因设备而异.

话虽这么说,"缓存的后台进程"通常是指没有前台活动且没有正在运行的服务的进程.这些进程只是因为我们有足够的内存来保存在内存中,因此,正如您所注意到的,用户可以快速切换回这些进程.由于Android开始需要更多的系统RAM用于其他进程,"缓存的后台进程"往往是被终止以释放系统RAM的进程.

"缓存后台进程"的一个突出示例是用户启动应用程序,短暂戳它,然后按HOME返回主屏幕.如果进程没有正在运行的服务,我希望将其列为"缓存的后台进程".

它们仍然在内存中,而不是切换到"磁盘"(就像台式机/笔记本电脑那样),对吧?

正确.Android设备不使用交换空间.


김준호*_*김준호 19

为什么不查看"设置"应用程序的源代码.

在我的Nexus 4中,"设置" - >"应用程序" - >"正在运行"如下所示.

在此输入图像描述 在此输入图像描述


在开始之前,Android Process中的重要性层次结构中有五个级别. 这些是

1)前景过程,
2)可见过程,
3)服务过程,
4)后台过程,
5)空过程

您可以在Android Developer站点的"进程和线程"文档中找到更多详细信息.

我确实研究过代码,事实证明"SHOW CACHED PROCESSES"显示了那些重要性层次等于或低于"后台进程"的进程.另一方面,"显示运行服务"显示其重要性等级等于"可见过程"或更高的那些.我放弃了一些细节以清楚地表明要点.您可以在此处查看此部分的完整源代码.

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) {
    }
Run Code Online (Sandbox Code Playgroud)


那么,回到你的问题,

它们仍然在内存中,而不是切换到"磁盘"(就像台式机/笔记本电脑那样),对吧?

是的,它们仍在内存中,但最终Android系统可能需要删除旧进程以回收新内存或更重要进程的内存.为了确定要保留哪些进程以及要杀死哪些进程,系统将每个进程放入"重要性层次结构".

当用户选中其中一个"缓存的后台进程"时,它会立即显示,因为它仍在内存中,就像正在运行的进程一样,对吧?

.例如,保持"空进程"存活的唯一原因是下次组件需要在其中运行时改善启动时间.

Android在"缓存"应用程序时会做什么?

AFAIK,它只是不会杀死进程并保持资源在他/她回来时立即回复用户.

  • 感谢您挖掘出设置源代码:) (4认同)