你缺的是“会跨进程”的那层设计感

很多 Android 学习者都会写 Activity、写布局,甚至能熟练用 Retrofit 调接口,但一遇到“系统服务”就懵了:为什么一个小小的“获取电量”“注册监听”要绕那么大一圈?为什么代码里到处都是 IBinder、Stub、ServiceConnection?这不是新框架,而是 Android 系统服务向应用层暴露 API 的固定套路。这门课不是教你怎么用某个现成 API,而是带你亲手把“一个系统服务”从空壳写到能跑,拆开 Binder 这层黑盒,看清服务端与调用端之间到底是谁在写哪一段代码。

常见的资料往往直接给你一张 AIDL 文件,然后说“工具会自动生成 Stub”,但你没见过 Stub 是怎么从 IBinder 里“长”出来的,也不清楚 Service 的 onBind 返回的到底是什么。这门课用六个单元把这条链拆开:先讲系统服务在 Android 里的角色,再讲为什么 IBinder 接口需要特殊化,然后亲自动手写 Stub 和 Service,最后分别覆盖开机自启动和运行时绑定两种注册方式,并用一个讨论单元帮你想清楚“Stub 到底该由谁来写”。学完你会明白:AIDL 只是让你少敲代码,而真正的 API 设计思路全在这些手工步骤里。

建议先看哪几块?按缺口来,别从头顺序看

如果你的基础是“会用 startService / bindService,但不懂 Binder 对象如何跨进程传递”,那么第一、二单元是最短的补课路径。先看“系统服务的角色”建立起大局观:服务端进程里跑着一个 Service,调用端通过 IBinder 拿到一张“接口卡”。第二单元“将 IBinder 接口特殊化”会告诉你为什么不能直接传原始 IBinder,而要定义一套自己的业务方法——这是面向接口编程在系统服务里的真实体现。

如果你已经知道 Binder 的大致流程,但一写代码就卡在 Stub 的模板上,重点看第三、四单元。第三单元会带着你逐行写 Stub 类,你会发现 Stub 其实是一个抽象类,把 IBinder 的 transact 方法包装成强类型的调用接口;第四单元则补上 Service 类的生命周期与 onBind 如何返回 Stub 实例。这两块是“API 设计”的核心实操。第五、六单元选看:第五单元讲开机时自动把服务登录到系统里,适合做系统应用或 ROM 开发方向的人;第六单元讲运行时绑定,适合普通应用需要跨进程获取数据的场景。最后一节的讨论题可以留到你写第一版代码遇到“不知道把 Stub 放哪个类里”时再回来看。

学完能独立做什么?怎么配合练习才算数

学完这门课,你应该能独立完成这样一件事:在一个应用进程里写一个 Service,定义一套自定义的业务接口(比如查询设备状态、上报数据),通过继承 Stub 实现接口,再在另一个进程里绑定这个 Service,拿到 Stub 后强转为接口调用,并正确处理跨进程回调。如果你能做到不靠 AIDL 自动生成,而是手写 Stub 的 asInterface 方法,然后你再回头去对比 AIDL 生成的文件,就能看出工具帮你省了什么、又替你藏了什么——这才是真正的“查漏补缺”。

练习要配合资料里的视频段落推进:每看完一单元,立刻用最小工程做一次验证。第一单元看完,写一个只有一个方法的本地 Service,观察 onBind 返回值;第二单元看完,把这个方法抽成自定义接口,再用 Proxy / Stub 模式改造;第三、四单元直接照着视频把 Stub 和 Service 手写出来,不要复制代码;第五、六单元分别在模拟器的开机广播和自己应用里做绑定

课程目录

1 单元-1_Android系统服务的角色 (16:28)
2 单元-2_将IBinder接口特殊化 (15:50)
3 单元-3_撰写Stub类的代码 (18:07)
4 单元-4_撰写Service类的代码 (08:20)
5 单元-5_开机时_登录Service服务 (09:09)
6 单元-6_Run-Time_绑定Service服务 (10:57)
7 单元-7_讨论_谁来撰写Stub类 (14:35)