往期回顾,专栏目录,更新动态,优惠政策,版权须知
温馨提示:如这是第一次接触《重学安卓》,可通过上述链接快速了解《重学安卓》专栏,获取 专栏目录、试读内容、更新动态 和 发展状况。
截至目前,专栏已对 体系化文章 实施 3310 余次修订,数十位群友告诉我,受专栏启发 亦开启了写作之路。群里不定期会有小伙伴讨论适配问题、分享原创开源库 和 提供内推机会,订阅后可随时进群交流。
前言
上一期《重学安卓:Activity 快乐你不懂》,我们一起追溯 Activity 及其上下游技术点 “存在缘由、职责边界、相互间关系”,相信阅读完小伙伴已对 Activity 来龙去脉 有了印象。
这一期我们着手 “Activity 生命周期” 拆解。
拒绝人云亦云
拆解过程也非一帆风顺,也曾想过多方参考借鉴,然发现网上盛传的 “Activity 生命周期” 文章,鲜有愿意 “追根溯源” 深入介绍 “进程模式”、及结合进程模式探究 “生命周期如此设计的依据”,恰恰相反,多是在堆砌文字、以讹传讹:
比如,“Activity 在 onStart 时是可见的,只是此时你看不见它 ~ ”,
又如,“当 Activity 处于 onStop 时可能被系统回收” ……
你是不是被这些 “似是而非” 说法糊弄许多年?
考虑到本专栏 “实事求是、直面本质” 宗旨,故这一期,我们继续从头开始追溯 Activity 进程模式、生命周期 的 存在意义 及相互间关系,相信阅读后你会醍醐灌顶。
文章目录一览
- 前言
- 拒绝人云亦云
- 不得不先讲的进程模式
- 何谓进程模式?
- 存在哪几种进程模式?
- 前景模式、可见模式,二者区别?
- Activity 的常规生命周期
- 生命周期节点与进程模式对应关系?
- 为何存在生命周期设计?
- 节点的特点、区别,及注意事项?
- 辟谣时间到 ~
- 综上
- Note 2020.9.26 加餐:
- 分享用于代替 “在 onPause 和 onStop 中做耗时操作” 的好招
- Note 2020.11.4 加餐:
- 面试时切忌使用 “Activity 被系统回收” 等说辞
- Note 2021.07.13 加餐:
- 可见模式,不如我们称其为 “失焦模式”
- Note 2022.02.10 加餐:
- 前景 App Activity “被虚拟机回收” 情况
不得不先讲的进程模式
许多文章会跳过进程模式,直接开讲生命周期,导致很多细节都是一笔带过、甚至张冠李戴。
故我们先从进程模式说起。
如此前你未明确过这概念,那么务必借此机会了解下。
何谓进程模式?
Android 平台 App,多是单进程。
由于 Android 平台资源有限,需为不同进程设置优先级,以便系统资源紧张时,通过 “杀死优先级较低进程” 释放资源。
因而,进程模式的存在是为了 “标记和区分” 进程优先级。
存在哪几种进程模式?
按优先级从高到低,进程模式主要包含:
前景进程、可见进程、服务进程、背景进程、空白进程 这 5 大类别。
通常,App 进程级别,由其 “活跃的或处于栈顶的组件” 的状态(比如所处生命周期)决定。
例如,当一个 Activity 处于 onResume,那么该 Activity 所在整个进程都会成为前景进程。
划重点 👆 👆 👆
于此同时,需再次强调,系统回收资源时,针对的是 App 的进程,而非 App 进程中的某个组件。(此处对应文末 “辟谣 2”)
划重点 👆 👆 👆
前景模式、可见模式,二者区别?
由于手机屏幕空间有限,一次只能展示一个窗口,但如果你拿 PC 来考虑,就不难理解为何要同时存在 “前景” 和 “可见” 这两种概念。
前景模式就相当于 PC 中 “获得焦点” 的窗口。
可见模式即是那些你可以看见,但 “失去焦点” 的窗口。
在 Remix OS 等安卓桌面操作系统中,你就会理解这样设计的价值。
划重点 👆 👆 👆
介绍完进程模式,下面我们结合 “进程模式” 来介绍生命周期。
Activity 的常规生命周期
Activity 生命周期包含 “常规流程” 和 “重建流程”。
考虑到本文主题是介绍 “进程模式” 和 “生命周期” 概念及对应关系,加上 “重建流程” 除了流程本身,还涉及 “状态保存和恢复” 等知识,因而 “重建流程” 内容,我们放在下期单独介绍。
生命周期节点与进程模式对应关系?
Activity 生命周期节点:
onCreate,onStart,onResume,onPause,onStop,onDestroy,onRestart。
当 App 处于背景模式时,类似于 PC 上窗口被最小化,随时有可能被系统回收。
划重点 👆 👆 👆
为何设计成先走 onPause,等到对方 onResume 后再走 onStop ?
因为处于前景的窗口只能有一个,为使跳转到的 Activity 能前景显示,首先得使此前的 Activity 离开前景模式,所以也可这么说,onPause 对系统的意义就在于 “离开前景模式”,对于开发者的意义就在于 “离开前景时有机会做一些小操作”。
再就是,Activity 跳转过程 是在同一线程内 同步执行,因而 为使新页面内容更快被呈现,流程得设计为 先走新页面 onCreate ~ onResume,再走旧页面 onStop。
服务模式不在本主题范畴,故不累述。
空白模式,是指系统为回收内存,而将处于背景模式的 App 回收为空白模式,等下一次需前台展示,再恢复内容和重新渲染。(所以不要觉得 “被回收便一无所有”,该保留的状态数据,系统还是会保留,等再次需要回到前景时,系统会为 App 恢复状态数据,做到 “起死回生”)。
划重点 👆 👆 👆