30

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

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

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

4

3 回答 3

50

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

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

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

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

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

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

于 2013-01-10T14:01:39.697 回答
20

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

在我的 Nexus 4 中,“设置”->“应用”->“运行”如下所示。

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


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

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

您可以在 Android 开发者网站的“进程和线程”文档中找到更多详细信息。

我确实查看了代码,结果发现"SHOW CACHED PROCESSES"显示了重要性层次等于或低于 "Background process" 的那些进程。另一方面,“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 系统可能需要删除旧进程来为新的或更重要的进程回收内存。为了确定保留哪些进程以及终止哪些进程,系统将每个进程置于“重要性层次结构”中。

当用户选择这些“缓存的后台进程”之一时,它会立即显示,因为它仍在内存中,就像正在运行的进程一样,对吧?

。例如,保持“空进程”处于活动状态的唯一原因是在下次组件需要在其中运行时缩短启动时间。

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

AFAIK,它根本不会终止进程并保留资源以在用户回来时立即响应用户。

于 2014-04-30T09:41:20.257 回答
1

进程等级

Android 操作系统会尽可能长时间地保持应用程序运行,但是当可用内存不足时,它会首先通过杀死重要性较低的进程来尝试释放系统中的资源。

这就是流程排名出现的时候;Android 进程按优先级从高到低排列在接下来的五个类别中:

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

当系统达到需要释放资源的程度时,将根据进程排名、上次使用的进程和运行的组件对可被杀死的进程进行排序。

来源

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

于 2016-10-26T06:33:37.807 回答