进程间通信

来源:互联网 发布:淘宝店铺升天猫费用 编辑:程序博客网 时间:2024/05/22 23:59
博客断了很久,博客之所以断,一者自己的学习的劲头没以前足了,二者自己的水平有限,写不出有营养的文章。
近日越发感觉自己以前学的东西由于使用的情况比较少,那些知识只剩下一些模糊的概念,先翻下记录,却无从查起,今天准备继续写自己的
博客,只为记录自己的学习和工作记录。
书归正传,先说下进程间的通信。
一个APP通常情况下,运行在一个进程里,工作两年了,还没有遇到过一个应用采用多进程模式开发应用,说句实话也很想针对现实场景
开发一个应用(一直混迹在小公司,眼光有些狭隘)。多进程会引起的很多麻烦事,这样说吧,两个进程里的东西所存在的位置不一样,他们不是
两个副本,那数据根本无法直接共享,还有Application会创建多次。你说这糟不糟心,他俩只是个双胞胎,完全不是一个人。好吧,照这样下来
还玩什么,那就得玩进程间的通信了,进程间如何通信。在Linux下用有管道,套接字等(我不懂Linux,稍微搜了下),Windows下
剪切板,socket,邮件槽等。进程间通信看样不是Android自己玩的,其他系统也存在。
Android进程间的通信主要分为两大类,socket和基于Binder的Messenger和AIDL等通信
Socket通信这个大家都知道,没必要赘述。

Messenger和ContentProvider他们进程间通信的原理就是AIDL,所以学习进程间的通信原理主要就是AIDL

首先看一下一个AIDL简单demo的项目结构
IMyAidlInterface.aidl是一个aidl定义的接口文件,语法跟Java差不多
MainActivity 是一个Activity,作为实验效果的展示
MyService 一个服务
Util 里面有一个获取当前进程名称
整个demo就这么多代码

可以看出,add 和get是在com.wxf.test进程里执行的,而OnClick是在wxf.com.aidl进程利执行的
他们是在不同的进程执行,这就是一个简单的进程间的通信。问题就这样完了吗,这只是说了怎么做可以进行进程的通信,还得探究下他们是怎么通信的,可以看下 app\build\generated\source\aidl\debug\wxf\com\aidl\IMyAidlInterface.java,这个文件,这个文件是由根据IMyAidlInterface.aidl文件自动生成的文件,看下这个文件的类的结构。

这个是由一个抽象类和Stub和自定义的方法构成
抽象类里有个代理类 和 构造方法,onTransact,以及asBinder,asInterface,还有几个跟我们自己自己相关的几个常量
代理类里有构造方法,asBinder,getInterfaceDescriptor和我们自己的方法,还有一个android.os.IBinder对象mRemote,这个类一大堆其实也就这么多东西。

这个方法是将服务端的Binder对象转化为客户端所需的AIDL对象。它分两种情况,如果是同一个进程返回的就是Stub本身,如果不是,则返回的是一个代理类

这个方法运行在服务端,当是跨进程时,由它来处理
在我看下,这个文件最重要的两个方法就是这两个,这两个方法基本上就可以讲述了Binder工作机制,这也是AIDL的核心。

demo

原创粉丝点击