编后语

编后语:保留第四版正文机制,以所有者—状态—结果合同、事件轨迹和章专属故障完成可重放验收。

学习目标

  • 能沿“编后语”的用户事件解释Android组件、状态所有者、线程与销毁边界。
  • 能围绕“回顾本书学习旅程——从第一个 App 到自定义 View 与属性动画,再展望 Android 开发的下一步:Jetpack Compose、协程、架构与测试。”改出一个可运行结果,并用前后状态而非组件数量验收。
  • 能在旋转、进程重建、拒权、离线或无效输入中选择适用反例,定位首个状态分叉。
  • 能用构建指纹、用户操作、状态快照、原始日志和行为断言独立重放结论,并标明第四版机制与现代targetSdk政策的边界。

你走到了这里

32 章。从一行 Kotlin 都看不懂,到能自己写自定义 View、用属性动画让界面动起来、用 Room 管理数据库、用 WorkManager 调度后台任务。这是一个扎实的跨越。

回头看看你走过的路——不是每个学 Android 的人都能坚持走完一本 700 页的编程指南。这件事本身就值得你为自己骄傲。

分步1 / 5

① 需求分析

先不写代码。把你要做的 App 用一两句话描述清楚:这个 App 解决什么问题?谁会用它?核心功能有哪些?然后把核心功能拆成一个个单页面的用户故事——"用户打开 App 后看到待办列表,点击 + 号可以添加新事项"——这决定了你的数据模型和 UI 结构。

全书知识地图

这本书的底层逻辑是:从"做出来"到"做得好"。八个模块,一条成长线:

阶段模块你学到了什么
入门基础Activity 生命周期、MVC 模式、UI 状态保存、调试
UIFragment & 布局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 生命周期

  • onCreateonStartonResumeonPauseonStoponDestroy
  • Fragment 的生命周期与 Activity 联动,尤其是 onAttach/onDetachonCreateView/onDestroyView
  • 核心理解:配置变更(旋转屏幕)不会销毁 Activity——它会走 onDestroyonCreate,但你需要用 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 开发的正确答案是协程launchasyncwithContext——挂起而非阻塞,结构化并发而非散养线程。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

编后语:事件轨迹

选择一次状态转换1 / 5

不变量:项目在没有书中步骤提示时仍可重建、解释、失败和恢复

交付证据:需求、设计决策、源码提交、测试、发布包和复盘记录

实验三:章专属反例与同输入恢复

注入“复制完成代码后只改包名,无法解释状态所有者和目标 SDK 差异”,保存第一个偏离点;撤销后以完全相同的 SDK、设备状态和用户事件重放。只有需求、设计决策、源码提交、测试、发布包和复盘记录一起恢复才算修复。

Fault · cancel · restore

编后语:反例与恢复

故障:复制完成代码后只改包名,无法解释状态所有者和目标 SDK 差异

1. 冻结输入一致

第 1 次使用相同 SDK、设备配置、初始状态与用户事件

2. 注入边界一致

保持正常输入不变,仅注入“复制完成代码后只改包名,无法解释状态所有者和目标 SDK 差异”

3. 检查所有者一致

项目在没有书中步骤提示时仍可重建、解释、失败和恢复

4. 核对结果一致

需求、设计决策、源码提交、测试、发布包和复盘记录

讨论

评论区加载中…