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;
}
Binder.transcat
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);
}
BinderProxy.transcat
Parcel类负责参数和返回结果的序列化和反序列化。
最新文章
- MySQL Workbench中修改表字段字符集
- TCP的拥塞控制
- 《Thinking in Java》十七章_容器深入研究_练习14(Page486)
- 将外卖O2O广告一棍子打成竞价排名,秤把平了吗?
- NYOJ:题目529 flip
- Wall Street English
- TCP协议的一些问题
- jQuery插件开发 - 其实很简单
- 【转】分享10VPN
- PL/SQL学习(一)
- hdu 2489 Minimal Ratio Tree
- 浏览器打开URL的方式和加载过程
- java自动化-juint框架简述
- PHP设计模式之工厂模式
- 混合开发使用Chrome Inspect调试WebView预览手机界面和定位元素
- python自动化开发-[第十五天]-jquery
- hdoj4685
- shiroWeb项目-授权(十一)
- Android 之开发积累
- flask--简记