技术文章参考
https://xiaozhuanlan.com/topic/0213584967
进程模式
Android 平台的 App,通常情况下都是单进程。
由于 Android 平台资源有限,需要为不同进程设置优先级,以便在系统资源紧张的情况下,将优先级较低的进程杀死,以释放资源。
因而,进程模式的存在就是为了标记和区分进程的优先级。
存在哪几种进程模式?
按优先级从高到低,进程模式主要包含:
前景进程、可见进程、服务进程、背景进程、空白进程 这 5 大类别
通常,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 此时 “被回收” 只可能是因为所在进程被系统回收。
划重点 👆👆👆