继续上一篇。

如果不使用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类负责参数和返回结果的序列化和反序列化。

最新文章

  1. MySQL Workbench中修改表字段字符集
  2. TCP的拥塞控制
  3. 《Thinking in Java》十七章_容器深入研究_练习14(Page486)
  4. 将外卖O2O广告一棍子打成竞价排名,秤把平了吗?
  5. NYOJ:题目529 flip
  6. Wall Street English
  7. TCP协议的一些问题
  8. jQuery插件开发 - 其实很简单
  9. 【转】分享10VPN
  10. PL/SQL学习(一)
  11. hdu 2489 Minimal Ratio Tree
  12. 浏览器打开URL的方式和加载过程
  13. java自动化-juint框架简述
  14. PHP设计模式之工厂模式
  15. 混合开发使用Chrome Inspect调试WebView预览手机界面和定位元素
  16. python自动化开发-[第十五天]-jquery
  17. hdoj4685
  18. shiroWeb项目-授权(十一)
  19. Android 之开发积累
  20. flask--简记

热门文章

  1. go-关键字-变量
  2. Kubernetes WebSSH终端窗口自适应Resize
  3. pytest5-使用conftest.py实现多文件共享fixture
  4. python编程系列---tcp客户端的简单实现
  5. ESP8266开发之旅 基础篇④ ESP8266与EEPROM
  6. 深copy
  7. Spring Cloud 网关服务 zuul 二
  8. SQL注入学习(二)
  9. Java多线程编程(三)线程间通信
  10. Linux下安装db2V9.7