Appearance
binder-messenger-demo
1. 实验目标
用最小 Android 实现验证 Binder 跨进程通信机制(对应 docs/01-runtime-concurrency/15):
bindService返回的IBinder就是 Binder 代理(跨进程时是BinderProxy)- Messenger:Binder 的高层封装(基于 Handler + Message),双向通信
replyTo机制:客户端把自己的 Messenger 放进 Message,服务端用它回信
2. 工程要点
- 服务端
MessengerService:Messenger(Handler)暴露,onBind返回messenger.binder - 客户端
BinderMessengerDemoActivity:bindService→onServiceConnected里拿 IBinder 包成 Messenger - 双向:客户端
send(MSG_PING, replyTo=自己的Messenger),服务端replyTo.send(MSG_PONG)回传 - 日志打印 IBinder 的实际类名(同进程是
Binder,跨进程是BinderProxy)
3. 运行方式
bash
cd labs/android/host
./gradlew installDebug设备/模拟器打开 Android Host → 打开 Binder / Messenger 实验室。
操作:绑定服务 → 发送 PING → 观察日志双向链路 → 解绑。
4. 预期现象
- 点"绑定服务":日志显示
拿到 IBinder=...(同进程Binder) - 点"发送 PING":Service Toast "收到 PING",客户端日志收到
PONG arg1=101 obj=服务端回包(Binder 双向) - 点"解绑":
onServiceDisconnected或解绑日志
5. 常见误区
| 误区 | 实际情况 |
|---|---|
| Binder 就是 AIDL | AIDL 只是 Binder 的 IDL 生成器;Messenger / Bundle 也是 Binder 封装 |
| 跨进程才能用 Binder | 同进程绑定也用 Binder(只是 Binder 直传,无 BinderProxy) |
send 是同步调用 | Messenger.send 是异步投递,跨进程时经 Binder 事务队列 |