0%

技术文章参考

https://xiaozhuanlan.com/topic/0213584967

进程模式

Android 平台的 App,通常情况下都是单进程。

由于 Android 平台资源有限,需要为不同进程设置优先级,以便在系统资源紧张的情况下,将优先级较低的进程杀死,以释放资源。

因而,进程模式的存在就是为了标记和区分进程的优先级。

存在哪几种进程模式?

按优先级从高到低,进程模式主要包含:

前景进程、可见进程、服务进程、背景进程、空白进程 这 5 大类别

https://images.xiaozhuanlan.com/photo/2021/a1e4a82bc9771970300307a37fcd2476.png

通常,App 进程的级别,由其活跃的或处于栈顶的组件的活动状况(比如所处生命周期)决定。

例如,当一个 App 的 Activity 处于 onResume,那么该 Activity 所在的整个进程都会成为前景进程。

划重点 👆 👆 👆

于此同时,需要再次强调的是,当系统回收资源时,针对的是 App 的进程,而不是针对 App 进程中的某个组件。(此处对应文末的 “辟谣 2”)

划重点 👆 👆 👆

前景模式、可见模式,二者的区别?

由于手机屏幕空间有限,一次只能展示一个窗口,但如果你拿 PC 来考虑,就不难理解为何要同时存在 “前景” 和 “可见” 这两种概念。

前景模式就相当于 PC 中 “获得焦点” 的窗口。

可见模式即是那些你可以看见,但 “失去焦点” 的窗口

官方的可见模式的含义

可见模式,不如我们称其为 “失焦模式”
为保持称谓的一致,本文在正文中沿用了 “官方文档” 对其所定义的各进程模式的称谓,同时本文也另辟蹊径地通过 “类比” 的方式来分析 “前景”、“可见” 等模式的本质和设计依据。

为此有小伙伴在理解了本文思路后,因官方 “可见模式” 这个概念的语义而产生困扰,毕竟确实如其所说,从字面上看,“可见” 即包含了 “前景可见” 和 “被部分遮挡但可见” 这两种情况,

其实我个人猜测,所谓 “前景模式” 和 “可见模式” 的概念,大概率是继承于 PC 操作系统中窗体的相关概念,然而 Android 又不想和它重名,就像鸿蒙手机系统的 Framework “换汤不换药” 地将 Activity 等组件改名为 Ability 一样,

因而综上,我们不妨结合本文的思路,来给 “可见模式” 取个更为恰当的名称 —— “失焦模式” —— 失去焦点的模式,与之相对的就是 “获焦模式”,这样无论从哪个角度来看,都是恰当的,毕竟 获焦或失焦隐含的潜台词就是 “页面已经可见了”。

Activity 被系统回收

系统回收的是进程,系统回收的是进程,系统回收的是进程!
重要的事情要讲三遍 👆👆👆

请不要再使用 “Activity 被系统回收” 等与客观实际有一定出入的描述(尤其在面试时,因为此处无意间流露了对 “计算机操作系统” 等基础知识的掌握程度,容易给人留下专业基础不扎实的印象。当然如果你是有意借此试探面试官的反应,看他到底 “行不行”,那就当我没说)

具体而言,如果 Activity A 和 B 分属于同一个 App 的两个进程,且 A 在后台进程,那么内存不足时 A 可能因为进程被回收而 受牵连;而如果 A 和 B 在同一个进程内,且 B 乃至 B 所处的进程处于前景或可见,那 A 则不会 受牵连。

简言之,这类事情的本质是 “进程被系统回收”。也即,只要 Activity 是保持在 Stop 而未步入 Destroy(例如处于非栈顶的位置),那么该 Activity 此时 “被回收” 只可能是因为所在进程被系统回收。

划重点 👆👆👆

如何理解Android手机内存