Win32 COM组件 x Android Service (二)
继续上一篇。
如果不使用AIDL(Android Interface Definition Language接口描述语言)编写服务接口的话,(COM组件,CORBA组件,ICE组件以及其它远程调用框架WCF,gsoap都有各自的接口描述语言,目的就是自动生成proxy和stub)。那么就要自己进行比较底层的使用,调用时分别IBinder是Binder还是BinderProxy,如果是Binder的话可以直接向下转换类型调用接口方法,否则就必须使用BinderProxy.transcat来进行远端调用和重写Binder的onTranscat进行调用映射转换。
转入本篇的正题上,观察 服务x线程x调用x进程x应用程序的关系。
定义下面5种使用方法,依次使用下面方法。
应用程序从Launcher启动,应用程序被创建,并收到创建通知。(注意在Linux下不存在真正的线程,线程号与进程号相同的话,就是进程的启动线程,一般也就是主线程)
先使用第一第二个按钮,分别在主线程和工作线程startService
然后使用第三个按钮,startService的目标服务放在外部进程。(在Manifest.xml中使用android:process属性)
最后使用第四第五个按钮,分别在工作线程上bindService,得到IBinder后在onServiceConnected回调中调用接口what。
现在在我的安卓系统中运行着两个(同样)应用程序(进程),每个应用程序关联着一个服务。
现在我不关闭服务,在前台任务中将Launcher启动的应用程序关闭会发生什么事呢?
最后附上Binder.transcat和BinderProxy.transcat代码
public final boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { if (false) Log.v("Binder", "Transact: " + code + " to " + this); if (data != null) { data.setDataPosition(0); } boolean r = onTransact(code, data, reply, flags); if (reply != null) { reply.setDataPosition(0); } return r; }
public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { Binder.checkParcel(this, code, data, "Unreasonably large binder buffer"); if (Binder.isTracingEnabled()) { Binder.getTransactionTracker().addTrace(); } return transactNative(code, data, reply, flags); }
Parcel类负责参数和返回结果的序列化和反序列化。
逆向深入objc,c++
windows下仿objc动画层UI引擎