编后语
编后语:保留第四版正文机制,以所有者—状态—结果合同、事件轨迹和章专属故障完成可重放验收。
学习目标
- 能沿“编后语”的用户事件解释Android组件、状态所有者、线程与销毁边界。
- 能围绕“回顾本书学习旅程——从第一个 App 到自定义 View 与属性动画,再展望 Android 开发的下一步:Jetpack Compose、协程、架构与测试。”改出一个可运行结果,并用前后状态而非组件数量验收。
- 能在旋转、进程重建、拒权、离线或无效输入中选择适用反例,定位首个状态分叉。
- 能用构建指纹、用户操作、状态快照、原始日志和行为断言独立重放结论,并标明第四版机制与现代targetSdk政策的边界。
你走到了这里
32 章。从一行 Kotlin 都看不懂,到能自己写自定义 View、用属性动画让界面动起来、用 Room 管理数据库、用 WorkManager 调度后台任务。这是一个扎实的跨越。
回头看看你走过的路——不是每个学 Android 的人都能坚持走完一本 700 页的编程指南。这件事本身就值得你为自己骄傲。
① 需求分析
先不写代码。把你要做的 App 用一两句话描述清楚:这个 App 解决什么问题?谁会用它?核心功能有哪些?然后把核心功能拆成一个个单页面的用户故事——"用户打开 App 后看到待办列表,点击 + 号可以添加新事项"——这决定了你的数据模型和 UI 结构。
全书知识地图
这本书的底层逻辑是:从"做出来"到"做得好"。八个模块,一条成长线:
| 阶段 | 模块 | 你学到了什么 |
|---|---|---|
| 入门 | 基础 | Activity 生命周期、MVC 模式、UI 状态保存、调试 |
| UI | Fragment & 布局 | Fragment 管理、RecyclerView、布局系统、App Bar、对话框 |
| 数据 | Intent & 数据传递 | 显式/隐式 Intent、拍照、本地化、辅助功能、数据绑定 MVVM |
| 样式 | 样式与主题 | Styles、Themes、XML Drawable、自定义 Drawable |
| 后台 | 后台任务 | HTTP 网络请求、Looper/Handler、搜索、WorkManager、Broadcast |
| 高级 UI | 高级 UI 与动画 | WebView、自定义 View 与触摸事件、属性动画 |
| 架构 | 架构思维 | MVVM、Room 数据库、Navigation Component、单元测试 |
| 思维 | 工程思维 | 兼容性处理、无障碍、数据持久化、后台调度 |
这张表不仅是你读过的目录——它是你能独立完成的工程能力清单。随便指一个模块,你都能说出核心概念、写出能跑的代码。
核心概念再梳理
在往前走之前,把最关键的几个概念再串一遍——这些是面试必问、项目必用的:
Activity 与 Fragment 生命周期
onCreate→onStart→onResume→onPause→onStop→onDestroy- Fragment 的生命周期与 Activity 联动,尤其是
onAttach/onDetach和onCreateView/onDestroyView - 核心理解:配置变更(旋转屏幕)不会销毁 Activity——它会走
onDestroy再onCreate,但你需要用onSaveInstanceState或 ViewModel 保住数据
RecyclerView——所有列表的基石
RecyclerView.Adapter+ViewHolder+LayoutManager三部曲notifyItemChanged/Inserted/Removed精确更新,避免全量刷新- ListAdapter + DiffUtil 自动计算差异(现代推荐做法)
Room——数据库不再难
- Entity、DAO、Database 三层抽象
@Insert、@Update、@Delete、@Query编译时校验- LiveData/Flow 与 Room 的响应式查询——数据一变,UI 自动更新
MVVM——架构的骨架
- Model(数据)→ ViewModel(逻辑)→ View(界面)
- ViewModel 在配置变更时存活,不持有 View 引用
- LiveData / StateFlow 驱动 UI 更新,单向数据流
WorkManager——可靠的后台任务
- 保证执行(即使 App 退出或设备重启)
- 约束条件(网络、电量、空闲状态)
- 链式任务编排(A 完成 → B 开始)
下一步学什么
这本书是"基础"——但不是"全部"。真正的 Android 开发栈,你还需要:
Jetpack Compose——声明式 UI 的未来
Google 已经明确 Compose 是 Android UI 的未来方向。它的核心思想是用 Kotlin 函数描述 UI——没有 XML,没有 findViewById,只有 @Composable 函数。学 Compose 不是"多学一个技能",而是换一种思维方式——从命令式(告诉系统怎么做)到声明式(描述你想要什么)。
Kotlin 协程与 Flow——异步编程的标准答案
书里用了 Thread、Handler、AsyncTask 来讲解后台任务——这些都是理解异步编程的基石。但现代 Android 开发的正确答案是协程。launch、async、withContext——挂起而非阻塞,结构化并发而非散养线程。Flow 是协程版的响应式流——比 LiveData 更灵活,更适合数据层到 UI 层的传递。
依赖注入——Hilt / Koin
当你的 App 有几十个 ViewModel、Repository、Service 时,手动 new 对象会变成一场噩梦。Hilt(基于 Dagger)和 Koin(纯 Kotlin DSL)让对象的创建和注入自动化——你只声明"我需要这个",框架帮你准备好。这是中等规模以上 App 的标配。
Clean Architecture——让代码经得起时间考验
MVVM 处理了 UI 层的架构。当 App 大到需要分层(数据层、领域层、展示层),Clean Architecture 提供完整的分层方案——依赖倒置、用例驱动、接口隔离。这不是"用不用"的问题,而是"什么时候开始需要"的问题。
测试——不是可选项
单元测试(JUnit + Mockito)、UI 测试(Espresso / Compose Testing)、端到端测试——测试不是"写完代码再补",而是开发流程的一部分。测试覆盖的代码让你敢于重构、敢于升级依赖、敢于加新功能。
推荐的持续学习资源
- Android 官方文档(developer.android.com)——最权威、最及时
- Android Developers Blog——新 API 和新特性的第一时间解读
- Kotlin 官方文档(kotlinlang.org)——协程、Flow、DSL 等进阶主题
- Now in Android——Google 官方的完整 App 示例,展示了现代 Android 开发的最佳实践
- Android 开发者社区——GitHub、Stack Overflow、中文社区(掘金、CSDN Android 板块)
真正的起点
这本书的结束不是终点。它是一个起点——你有了坚实的地基,知道了怎么"造房子",接下来就是选择方向:是做漂亮的 UI(Compose + 动画)、做稳定的架构(Clean Architecture + 测试)、还是做深入的底层(性能优化、NDK)。
Android 开发是一个持续进化的领域——每年都有新的 API、新的范式、新的工具。但底层的东西不变:对用户负责的心态、写可读代码的习惯、定位问题的能力、持续学习的动力。这些,是任何一本书都教不了,但你在这一年里已经慢慢磨练出来的东西。
继续写代码,继续造东西。最好的学习永远是——做一个自己想用的 App。
练习
问题 1:“第32章 Afterword”覆盖哪些正式节点和项目主线?
问题 2:怎样建立本页最小可执行实验?
问题 3:为什么只在正常点击路径运行不能证明完成?
问题 4:怎样设计能推翻当前实现的反例?
问题 5:从第4版语境迁移到现代目标SDK时如何控制变量?
问题 6:本页达到独立交接标准需要什么?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- MVVM
Model-View-ViewModel 架构模式。Model 管理数据,ViewModel 持有 UI 状态和业务逻辑(在配置变更时存活),View 观察 ViewModel 的状态变化并更新 UI。单向数据流:View → ViewModel → Model → ViewModel → View。
- Jetpack Compose
Google 推出的声明式 UI 框架。用 Kotlin 函数描述 UI,无需 XML。核心概念:Composable 函数、状态驱动重组、Material 3 组件。是 Android UI 开发的未来方向。
- Kotlin 协程 (Coroutines)
Kotlin 的异步编程方案。核心特点:挂起而非阻塞(suspend 关键字)、结构化并发(父协程取消则子协程全部取消)、轻量级(百万协程不是梦)。配合 Flow 实现响应式数据流。
- 依赖注入 (Dependency Injection)
对象不自己创建依赖,而是由外部"注入"。好处:解耦、可测试、可替换实现。Android 常用方案:Hilt(基于 Dagger 的官方方案)和 Koin(轻量级纯 Kotlin DSL 方案)。
“编后语”不使用未获授权的纸书正文;InformIT出版信息与授权电子版完整目录只用于确认第四版32章、269个正式目录节点和时代语境,第四版官方勘误用于识别工具链变更。下列中文解释、图示、交互、代码与练习均为独立教学重写,平台行为再以Android Developers的一手文档复核。
为什么“编后语”必须回到可观察状态
“编后语”的学习结果不是记住类名,而是能预测“回顾本书学习旅程——从第一个 App 到自定义 View 与属性动画,再展望 Android 开发的下一步:Jetpack Compose、协程、架构与测试。”在一次输入、一次重建和一次失败中的不同状态,并指出哪条Android合同产生差异。
第四版机制逐项深读
32. Afterword
在“编后语”中,“32. Afterword”把六个示例应用收束为独立项目:学习者要自行定义用户任务、状态所有者、外部合同、测试矩阵与发布证据,而非再照抄步骤。
The Final Challenge
在“编后语”中,“The Final Challenge”把六个示例应用收束为独立项目:学习者要自行定义用户任务、状态所有者、外部合同、测试矩阵与发布证据,而非再照抄步骤。
Shameless Plugs
在“编后语”中,“Shameless Plugs”把六个示例应用收束为独立项目:学习者要自行定义用户任务、状态所有者、外部合同、测试矩阵与发布证据,而非再照抄步骤。
Thank You
在“编后语”中,“Thank You”把六个示例应用收束为独立项目:学习者要自行定义用户任务、状态所有者、外部合同、测试矩阵与发布证据,而非再照抄步骤。
“编后语”验收回顾
“编后语”只有在构建指纹、用户操作、状态快照、原始日志和行为断言能够从相同基线再次得到相同断言时才通过;第四版机制与现代平台政策分别记录,不用新API名称掩盖旧行为。
← 上一页:属性动画 · 下一页:《Android Programming: The Big Nerd Ranch Guide(第4版)》全书总复习 →
章专属可重放状态实验
先预测“从空仓库实现最终挑战并由另一人复核”发生后,学习者的产品需求、状态模型和发布负责人应怎样改变用户任务、架构边界、依赖、测试矩阵和发布制品;再操作三个实验。第四版示例与当前 Android 政策分别记录,实验不把新 API 名称倒填为原书内容。
实验一:所有者—状态—结果合同
选择任一正式目录节点和正常/边界场景,检查它是否真的进入本章状态合同。目录标题只有同时出现在解释、可视状态和交付证据中才算覆盖。
Owner · state · observable result
编后语:状态合同
把第四版跟做项目转化为可独立定义、构建、测试和发布的 Android 应用
验证场景
第四版正式目录节点
afterword · 正常任务
32. Afterword:固定 SDK、设备配置和初始状态,触发“从空仓库实现最终挑战并由另一人复核”
冻结入口:32. Afterword
记录学习者的产品需求、状态模型和发布负责人的初始用户任务、架构边界、依赖、测试矩阵和发布制品
观察:需求、设计决策、源码提交、测试、发布包和复盘记录中的“32. Afterword”轨迹
预期:由学习者的产品需求、状态模型和发布负责人提交用户任务、架构边界、依赖、测试矩阵和发布制品,并持续满足“项目在没有书中步骤提示时仍可重建、解释、失败和恢复”
实验二:事件与生命周期轨迹
沿五次转换逐步执行“从空仓库实现最终挑战并由另一人复核”。每一步只允许学习者的产品需求、状态模型和发布负责人按职责提交状态,并持续核对“项目在没有书中步骤提示时仍可重建、解释、失败和恢复”。
Deterministic event replay
编后语:事件轨迹
不变量:项目在没有书中步骤提示时仍可重建、解释、失败和恢复
交付证据:需求、设计决策、源码提交、测试、发布包和复盘记录
实验三:章专属反例与同输入恢复
注入“复制完成代码后只改包名,无法解释状态所有者和目标 SDK 差异”,保存第一个偏离点;撤销后以完全相同的 SDK、设备状态和用户事件重放。只有需求、设计决策、源码提交、测试、发布包和复盘记录一起恢复才算修复。
Fault · cancel · restore
编后语:反例与恢复
故障:复制完成代码后只改包名,无法解释状态所有者和目标 SDK 差异
第 1 次使用相同 SDK、设备配置、初始状态与用户事件
保持正常输入不变,仅注入“复制完成代码后只改包名,无法解释状态所有者和目标 SDK 差异”
项目在没有书中步骤提示时仍可重建、解释、失败和恢复
需求、设计决策、源码提交、测试、发布包和复盘记录