aidl运用方法:aidl接口文件,它会自动生成java的接口文件(包含抽象类Stub,代理类Proxy);
Activity中,实现ServiceConnection接口,初始化全局AidlService变量;
调用bindService方法,传入mServiceConnection;
aidl执行过程:AIDLTestService onCreate;
AIDLTestService onBind;
AIDLTestService onStart;
ServiceConnection onServiceConnected,调用 mService = AIDLService.Stub.asInterface(iBinder),获得aidl接口的对象,现在已实现activity调用service的能力;
如果service中调activity方法,可以把AidlActivity对象传入到service中,利用装饰设计模式。
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
调用AIDL接口是直接的方法调用的,不是我们所想象的调用是发生在线程里。
对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
AIDL只支持接口方法,不能公开static变量。
aidl生成类文件,Stub类就是继承于Binder类,也就是说RemoteService类和普通的Service类没什么不同,只是所返回的IBinder对象比较特别,是一个实现了AIDL接口的Binder。
总的来说,AIDLActivity.aidl编译会生成一个AIDLActivity接口,一个stub存根抽像类,一个proxy代理类,这个实现其实根axis的wsdl文件编译生成思路是一致的,stub存根抽像类需要在服务端实现,proxy代理类被客户端使用,通过stub,proxy的封装,屏蔽了进程通信的细节,对使用者来说就只是一个AIDLActivity接口的调用。
如果bindService绑定的是同一进程的service,返回的是服务端Stub对象本省,那么在客户端是直接操作Stub对象,并不进行进程通信了;bindService绑定的不是同一进程的service,返回的是代理对象,obj==android.os.BinderProxy对象,被包装成一个AIDLService.Stub.Proxy代理对象。
选择AIDL的使用场合:只有你允许客户端从不同的应用程序为了进程间的通信而去访问你的service,以及想在你的service处理多线程。
高手可以基于Binder写自己的服务;
aidl,对参数的写入与读取进行了约定封装;