重学安卓1-2:Activity生命周期的3个辟谣

作品简介
往期回顾专栏目录更新动态优惠政策版权须知
温馨提示:如这是第一次接触《重学安卓》,可通过上述链接快速了解《重学安卓》专栏,获取 专栏目录、试读内容、更新动态 和 发展状况。
截至目前,专栏已对 体系化文章 实施 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 生命周期节点

onCreateonStartonResumeonPauseonStoponDestroyonRestart


当 App 处于背景模式时,类似于 PC 上窗口被最小化,随时有可能被系统回收

划重点 👆 👆 👆


为何设计成先走 onPause,等到对方 onResume 后再走 onStop

因为处于前景的窗口只能有一个,为使跳转到的 Activity 能前景显示,首先得使此前的 Activity 离开前景模式,所以也可这么说,onPause 对系统的意义就在于 “离开前景模式”,对于开发者的意义就在于 “离开前景时有机会做一些小操作”。

再就是,Activity 跳转过程 是在同一线程内 同步执行,因而 为使新页面内容更快被呈现,流程得设计为 先走新页面 onCreate ~ onResume,再走旧页面 onStop。


服务模式不在本主题范畴,故不累述。

空白模式,是指系统为回收内存,而将处于背景模式的 App 回收为空白模式,等下一次需前台展示,再恢复内容和重新渲染。(所以不要觉得 “被回收便一无所有”,该保留的状态数据,系统还是会保留,等再次需要回到前景时,系统会为 App 恢复状态数据,做到 “起死回生”)。

划重点 👆 👆 👆

为何存在生命周期设计?


创作时间: