从Activity的启动学习Binder机制
AMS类关系图
核心类功能
- IActivityManager:继承IInterface接口,抽象出跨进程通信要实现的功能
- ActivityManagerNative:继承binder,承担binder职责,实现了核心方法onTransact,在该方法中读取Parcel中数据,调用方法处理数据,然后向Proxy返回结果
- ActivityManagerService: IActivityManager的实现类,实现了跨进程通信要调用的功能
- ActivityManagerProxy:数据存储在Parcel中并传输数据给server,获取server端传回的结果并返回
- Parcel:用于client与service端进行数据交互的类
代码流程分析
AIDL的使用
- AIDL是Android 系统给应用层开发者提供的一种简便的跨进程通信方案。他的底层还是binder实现
- Server端:在AIDL文件中声明接口(跨进程要执行的功能),根据该文件在编译时动态生成IxxxInterface,Stub(与ActivityManagerNative功能一致),xxxProxy类,然后你需要在Service中继承Stub类,实现跨进程通信要执行的功能。
- Client端:继承ServiceConnection接口,在onServiceConnected方法中获的Proxy引用,就可以回调Service端方法
- client和Server建立连接:bindService
- AIDL调用流程:bindService(在调用bindService后,会调用Service的onBind方法,在onBind方法中,会回调ServiceConnection的onServiceconnected方法)