第1章 Activity的生命周期和启动模式
依据得到电子书完整目录覆盖8个节点:从典型与异常生命周期、LaunchMode、Flags和IntentFilter建立Activity任务栈与状态恢复模型
第1章 Activity的生命周期和启动模式
本页依据任玉刚《Android开发艺术探索》完整目录独立重构,不复制原文。版本锁定电子工业出版社2015年9月第1版、507页、ISBN 9787121269394,原书机制以Android 5.0与Java应用层/源码分析为基线。
原书中的AsyncTask、IntentService、旧权限/后台/存储规则和部分framework实现具有历史边界。课程先准确解释出版时机制,再单独建立现代targetSdk迁移账本;不会用Compose、协程或当前Jetpack替换原书目录后仍声称一比一覆盖。
学习目标
- 能解释“第1章 Activity的生命周期和启动模式”全部正式节点的调用方、所有者、线程、进程、状态与Android 5.0边界。
- 能实现“从典型与异常生命周期、LaunchMode、Flags和IntentFilter建立Activity任务栈与状态恢复模型”的最小垂直切片,并保存源码、构建、操作、日志和断言。
- 能比较正常、边界、组件重建、进程退出、队列阻塞与外部失败,分析“把onDestroy当作必然回调,或把启动模式与Intent Flags混为同一层配置”。
- 能设计反例并凭生命周期轨迹、任务栈快照、重建状态、启动矩阵和Intent匹配测试完成独立交接。
从framework因果链开始
Android API只是入口。每个实验先找↡创建、持有并最终取消或释放Activity、View、Binder连接、线程任务与原生资源的明确主体,再画“应用调用 → framework代理 → Binder或消息队列 → 系统/目标对象 → 回调”的链路。↡一次用户动作跨对象、线程与进程产生可观察结果的有序调用关系帮助区分源码事实和表面现象。
主线程、Binder线程池、HandlerThread、线程池和原生线程有不同责任。↡回调实际执行的线程、队列顺序以及允许阻塞或触碰UI的约束必须写在代码旁。状态也要分为界面暂态、可恢复实例状态、进程内缓存、文件/数据库事实和系统服务状态;进程单例从来不是持久事实源。
本章主线是从典型与异常生命周期、LaunchMode、Flags和IntentFilter建立Activity任务栈与状态恢复模型。所有节点都要生成↡由固定环境、输入、操作、原始日志、时序、资源计数与断言组成的可重放结论,并声明↡Android版本、targetSdk、设备实现、framework源码分支与依赖共同限定的结论范围。正常截图不证明线程、重建、失败和释放正确。
权威目录逐节点映射
第1章 Activity的生命周期和启动模式
正式节点 1/8。 “第1章 Activity的生命周期和启动模式”要同时记录回调顺序、任务栈、Intent输入和可恢复事实。正常返回、旋转、后台回收、进程重建与重复启动必须分别实验,不能从一次前台运行外推生命周期。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.1 Activity的生命周期全面分析
正式节点 2/8。 “1.1 Activity的生命周期全面分析”要同时记录回调顺序、任务栈、Intent输入和可恢复事实。正常返回、旋转、后台回收、进程重建与重复启动必须分别实验,不能从一次前台运行外推生命周期。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.1.1 典型情况下的生命周期分析
正式节点 3/8。 “1.1.1 典型情况下的生命周期分析”承担本章机制链的一环。说明入口、所有者、线程、状态、系统边界、失败与释放,再把观察连接到生命周期轨迹、任务栈快照、重建状态、启动矩阵和Intent匹配测试;只列API名称不算覆盖。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.1.2 异常情况下的生命周期分析
正式节点 4/8。 “1.1.2 异常情况下的生命周期分析”承担本章机制链的一环。说明入口、所有者、线程、状态、系统边界、失败与释放,再把观察连接到生命周期轨迹、任务栈快照、重建状态、启动矩阵和Intent匹配测试;只列API名称不算覆盖。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.2 Activity的启动模式
正式节点 5/8。 “1.2 Activity的启动模式”要同时记录回调顺序、任务栈、Intent输入和可恢复事实。正常返回、旋转、后台回收、进程重建与重复启动必须分别实验,不能从一次前台运行外推生命周期。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.2.1 Activity的LaunchMode
正式节点 6/8。 “1.2.1 Activity的LaunchMode”要同时记录回调顺序、任务栈、Intent输入和可恢复事实。正常返回、旋转、后台回收、进程重建与重复启动必须分别实验,不能从一次前台运行外推生命周期。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.2.2 Activity的Flags
正式节点 7/8。 “1.2.2 Activity的Flags”要同时记录回调顺序、任务栈、Intent输入和可恢复事实。正常返回、旋转、后台回收、进程重建与重复启动必须分别实验,不能从一次前台运行外推生命周期。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
1.3 IntentFilter的匹配规则
正式节点 8/8。 “1.3 IntentFilter的匹配规则”要同时记录回调顺序、任务栈、Intent输入和可恢复事实。正常返回、旋转、后台回收、进程重建与重复启动必须分别实验,不能从一次前台运行外推生命周期。
先预测一次正常路径和一次故障路径,再只改变一个条件。记录调用线程、对象或系统服务所有者、持久事实、原始日志、耗时或资源计数;能运行但无法区分机制与偶然结果,仍不算掌握。
最小可执行切片
下面的Java片段只抓住本章核心合同。先预测线程、状态和失败,再在匹配Android 5.0语境的样例工程中运行;代码所依赖的上下文和导入应在工程中显式声明。
public final class ActivityTrace {
private final List<String> events = new ArrayList<>();
void record(String callback) { events.add(callback); }
List<String> snapshot() { return new ArrayList<>(events); }
}
// Compare normal navigation, rotation, reclaim and each launch mode.固定环境并保留构建、安装、组件与线程证据:
./gradlew --no-daemon clean test assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am force-stop org.example.art
adb shell monkey -p org.example.art 1
adb shell dumpsys activity processes > processes.txt
adb logcat -d -v threadtime > run.log将机制写成能失败的行为合同:
Given a pinned JDK, Android plugin, device API, process state, permission state, and input
When the smallest scenario for "adae15-01-activity-lifecycle-launch-mode" crosses its owner, thread, or process boundary
Then callbacks, durable state, side effects, timing, and resource release match the prediction
And process death, owner destruction, malformed input, queue pressure, and repeated work stay observable
And modern targetSdk differences are recorded as migration evidence, not original behavior三段材料分别约束源码机制、环境重放和用户可见结果。若日志没有线程名、进程号、输入标识和阶段,或测试只断言“没有崩溃”,就无法证明真正经过目标调用链。
四层源码与故障证明
调用层。 从“第1章 Activity的生命周期和启动模式”选择一次入口,写出应用对象、framework代理、系统服务或目标组件以及返回路径。对源码分析,记录Android版本、类名、方法与关键分支;对应用实验,记录用户动作、Intent或消息标识。先解释谁创建工作、谁持有引用、谁负责结束,再谈API细节。
线程与进程层。 在每个箭头上标线程和进程。主线程不能执行无界I/O或计算;Binder回调不自动处于主线程;Service也不自动提供后台线程。用线程名、进程号、队列长度和时间戳验证,分别注入进程退出、Binder死亡、队列饱和和组件销毁,检查迟到结果是否被丢弃。
状态与资源层。 列出可恢复事实、缓存和外部资源。旋转、后台回收、进程重建、列表复用与配置变化后,界面应由事实重建,而不是依赖旧对象。文件、Cursor、Bitmap、动画、Window、线程池和JNI引用都要有关闭或取消点;保存前后资源计数,避免只靠肉眼判断泄漏。
迁移层。 原书锁定Android 5.0。现代迁移一次只改变targetSdk、组件导出、后台限制、存储、权限、通知、构建插件或替代API之一,比较构建、调用链、用户行为、测试与回滚。新实现可以使用Jetpack或结构化并发,但必须保留原书机制说明,不能抹去历史API为何工作及为何后来受限。
围绕“把onDestroy当作必然回调,或把启动模式与Intent Flags混为同一层配置”预写一个推翻条件:状态丢失、错误线程、越权、ANR、泄漏、结果错位、重复副作用或原生崩溃中的任一项出现,都意味着当前实现不成立。最终交付生命周期轨迹、任务栈快照、重建状态、启动矩阵和Intent匹配测试,让他人无需口头提示即可复现。
本章回顾
本页从“第1章 Activity的生命周期和启动模式”覆盖到“1.3 IntentFilter的匹配规则”,共8个正式节点。掌握标准是能沿“从典型与异常生命周期、LaunchMode、Flags和IntentFilter建立Activity任务栈与状态恢复模型”解释调用因果链,运行正常、重建与故障实验,并让另一位开发者凭生命周期轨迹、任务栈快照、重建状态、启动矩阵和Intent匹配测试重放结论。
练习
问题 1:“第1章 Activity的生命周期和启动模式”覆盖哪些正式节点和机制主线?
问题 2:怎样建立本章最小可执行切片?
问题 3:本章最需要推翻的错误假设是什么?
问题 4:为什么一次正常运行不能证明framework机制?
问题 5:怎样迁移到现代targetSdk而不改写原书?
问题 6:达到独立交接标准需要哪些证据?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 生命周期所有者
- 创建、持有并最终取消或释放Activity、View、Binder连接、线程任务与原生资源的明确主体。
- 调用因果链
- 一次用户动作跨对象、线程与进程产生可观察结果的有序调用关系。
- 线程合同
- 回调实际执行的线程、队列顺序以及允许阻塞或触碰UI的约束。
- 证据链
- 由固定环境、输入、操作、原始日志、时序、资源计数与断言组成的可重放结论。
- 版本边界
- Android版本、targetSdk、设备实现、framework源码分支与依赖共同限定的结论范围。