当 ComponentActivity(以及 Fragment)选择实现 LifecycleOwner 接口并暴露 lifecycle 对象时,Google 官方实际上是在向全球 Android 开发者推行一场“权力交接”。
这体现了以下三个核心思想:
1. 从“命令式”转向“声明式” (From Imperative to Declarative)
-
官方初衷:官方希望开发者停止在 Activity 的生命周期方法(
onCreate,onStart,onResume...)里编写琐碎的控制逻辑。 - 体现的思想:控制反转 (Inversion of Control)。
- 旧思想:Activity 是“国王”,它必须亲自指挥所有组件:“现在我启动了,视频播放器你快去初始化;现在我暂停了,你快去停止。”
-
新思想:Activity 只是一个“事件源”。组件(如你的
PermissionRefreshObserver)通过addObserver声明自己的需求。Activity 不再需要主动指挥,逻辑由生命周期状态驱动自动流转。
2. 解决“关注点弥散”与“逻辑碎片化”
- 官方初衷:避免 Activity 变成一个数千行的 "God Object"。
- 体现的思想:关注点分离 (Separation of Concerns)。
- 在旧模式下,权限检查、定位追踪、视频缓冲、数据埋点,这些完全不相关的逻辑全都塞在
onStart/onStop里,导致代码极难维护。 - 通过暴露
lifecycle,官方允许你把这些逻辑各自封装成独立的LifecycleObserver。每个组件只关注自己的那一亩三分地,Activity 彻底沦为一个“生命周期容器”。
3. 处理“生命周期的不可预测性” (Defensive Robustness)
- 官方初衷:解决 Android 系统中臭名昭著的异步任务与生命周期不匹配导致的崩溃和内存泄漏。
- 体现的思想:生命周期安全 (Lifecycle Safety)。
- 官方希望通过
lifecycle提供一个标准化的查询窗口。 - 开发者可以随时询问
lifecycle.currentState。这意味着,当一个网络回调返回时,你可以先问问:“这个 Activity 还活着吗?”如果它已经DESTROYED,就不要去操作 UI。这避免了无数IllegalStateException和Memory Leak。
4. 建立“统一的契约”
- 官方初衷:让第三方库能够以无侵入的方式接入 Activity。
- 体现的思想:插件化架构 (Pluggable Architecture)。
- 比如 LiveDate, Room, WorkManager,甚至你用的 Compose,它们都依赖这个
lifecycle契约。 - 这意味着只要你的组件遵循这个契约,它就可以像“插拔件”一样,挂载到任何
ComponentActivity上,而不需要修改 Activity 内部的一行代码。