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

时间:2013-01-10 13:52:08

标签: android background-process

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

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

Android“缓存”应用程序时会做什么?

3 个答案:

答案 0 :(得分:44)

  

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

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

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

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

  

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

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

答案 1 :(得分:19)

为什么不查看"Setting" app's source code

在我的Nexus 4中,“设置” - > “App” - > “跑步”看起来如下。

enter image description here enter image description here


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

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

您可以在"Processes and Threads" document in Android Developer site找到更多详情。

我确实查看了代码,结果显示“SHOW CACHED PROCESSES”显示了那些重要层次结构等于或低于“后台进程”的进程 即可。另一方面,“显示运行服务”显示 ,其重要性层次结构等于“可见进程”或更高 。我放弃了一些细节以清楚地表明要点。您可以看到此部分here的完整源代码。

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系统可能需要删除旧进程以回收新内存或更重要进程的内存。要确定要保留哪些进程以及要删除哪些进程,系统会将每个进程置于“重要性层次结构”中。

  

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

从右即可。例如,the only reason to keep "Empty process" alive is to improve startup time the next time a component needs to run in it.

  

Android“缓存”应用程序时会做什么?

AFAIK,它只是不会终止进程并保持资源,以便在他/她回来时立即回复用户。

答案 2 :(得分:1)

流程排名

Android操作系统试图维持应用程序运行一段时间 尽可能,但是当可用内存很低时,它会尝试释放资源 系统通过杀死具有较低重要性的进程来发挥作用。

这是流程排名进入画面的时候; Android进程是 在从较高优先级到较低优先级的下一个五类中排名:

  • 前台进程:这是一个托管活动或服务的进程 用户当前正在与之交互:在前台启动的服务或 服务运行其生命周期回调
  • 可见进程:这是一个托管暂停活动或服务的进程 受限于可见的活动
  • 服务流程:这是一个托管未绑定服务的流程 可见活动
  • 后台进程:这是一个承载不可见活动的进程;所有 后台进程按最近最少使用(LRU)列表排序, 因此,最近使用的进程是最后被杀死的进程 它们
  • 空进程:这是用于缓存非活动Android组件的进程 并改善任何组件启动时间

当系统到达需要释放资源的点时,进程 考虑到最后使用的过程等级,可以对被杀的进行排序 流程和组件正在运行。

来源

异步Android编程 - 第二版 - Helder Vasconcelos - 2016年7月