android Services AIDL 解析

来源:互联网 发布:java高性能http框架 编辑:程序博客网 时间:2024/06/18 08:09

1、service所在进程,同一个包的属于同一个进程,和startService和bindService没有关系

他们的区别在于startSerivce无参,适用于自管理状态。BindSerivce可以通过onbind返回IBinder对象,然后客户端通过传入的ServiceConnection获取IXXXService获得服务接口,进行IPC调用。

另外一点区别在于bindService与 与其绑定的Activity共存亡,activity结束后,ServiceConnection断开,Service停止

StartService一旦启动后,可以一直存在与调用者没有关系。除非使用stopService或者service端自己调用stopSelf

 

AIDL生成代码实现原理

根据AIDL文件生成一个接口,接口继承IInterface

内部生成一个静态抽象类Stub,Stub有两个重要方法,asBinder和asInterface

asBinder返回本地Binder对象(接口),asInterface根据传入IBinder决定返回远程接口还是本地接口。

Stub内部还有一个私有远程类Proxy实现了服务端接口功能(真正功能没有实现,只是对于参数打包),远程类对接口的调用参数进行了规范,通过transact进行IPC调用 Stub 重载了onTransact,与远程类写入相同的顺序读取参数,然后调用本地接口实现。

可以这么认为Proxy的代码运行在客户端,而Stub的代码运行在服务端,Proxy接口中的transact方法执行了远程对于服务端的调用,Stub在onTransact方法中进行Parcel参数获取和本地调用

AIDL规定了客户端和服务端Parcel数据读取顺序,以及提供了获取IBinder引用的接口

 

客户端通过ServiceConnection对象的回调函数,onServiceConntected传入的IBinder对象,获取服务接口,然后进行IPC调用

 

服务端通过继承AIDL生成的服务接口的抽象类Stub,实现服务接口。通过onBind返回这个Stub(Binder)