Android中进程间通信机制AIDL

来源:互联网 发布:网络对人类认知优点 编辑:程序博客网 时间:2024/05/18 18:16

  学习AIDL之前,我们需要知道的一个知识点就是,在Android中,其实也就是Linux系统中,进程之间是不能共享内存的。因此,如果我们想要在不同的进程之前进行通信或者数据共享,就要提供一些特殊的机制来实现。也就引出了今天要学习的AIDL(Android Interface Definition Language).

   前几天买了vpn,从公司也能上google了。也可以随时fq查文档了。下面就按照Google文档给出的步骤来说明步骤:

总的来说,分为三个大的步骤:

  1. Create the .aidl file  : This file defines the programming interface with method signatures.
  2. Implement the interface  :  The Android SDK tools generate an interface in the Java programming language, based on your .aidl file. This interface has an inner abstract class named Stub that extends Binder and implements methods from your AIDL interface. You must extend the Stub class and implement the methods.

  3. Expose the interface to clients : Implement a Service and override onBind() to return your implementation of the Stub class.

     下面就按照我自己理解的进行描述。第一步首先在工程中创建一个.aidl文件。其声明格式非常简单,和接口的定义类似。如果是使用Android studio开发的话,需要在src下面先创建一个aidl目录,然后在创建.aidl文件。创建好之后,重新build工程,就会自动生成.java文件了。Eclipse中更加简单,直接创建了.aidl文件之后就会自动在gen目录下面生成.Java文件了。自动生成的.Java文件我们不需要做任何的改动。
      在学习的过程中,文档中讲有一个Stub类,接下来我们要在服务端实现的就是该类。在服务端创建一个继承于service的自定义service,注意,该service是binder类型的service,所以我们要返回Ibinder对象。要返回的该Ibinder对象就是刚刚自动生成的.java文件中的.stub对象的实例.其实和binder服务很像,只不过是普通的binder类型的service绑定返回的是继承于Binder类的实例对象。由于客户端跨进程返回其他进程的数据,进行通信,所以service中需要进行相应的逻辑处理。具体的逻辑处理就是在.Stub的类中实现的.在进行实现匿名类时,需要实现.aidl文件中定义的所有方法,也就是所要进行的逻辑处理方法,完善好方法,处理好逻辑,将数据进行返回就可以了。服务端就算大工告成了。
      接下来,剩下的事情是客户端的工作。首先,需要将服务端刚刚定义的aidl文件拷贝到客户端工程,注意,文件路径等必须和原来在服务端保持一致。很快就要结束了,下面的事情是我们开始绑定服务,之前已经说过,aidl是基于绑定服务的,所以,在要绑定的界面中,应该创建一个绑定连接对象ServiceConnection,一般情况下会直接定义生成一个对象,其中,会自动实现两个方法,第一个叫:onServiceConnected()方法,该方法就是在绑定成功时进行调用,第二个方法是onServiceDisconnected()该方法是在组件与服务进行取消绑定是调用的。我们要做的重点工作就在第一个方法onServiceConnected方法中,我们的目的是进行进程间的通讯,aidl文件会自动生成.java文件,我们要用的就是那个对象,其实最终就是一个代理对象帮我们去远端获取数据,我们本地是从代理对象中拿到的数据。接着上文说,我们需要定义个.aidl类型的变量,然后在onServiceConnected方法中对其进行实例化:实例化代码:xx.Stub.asInterface(service);实例化完该代理对象后,我们就可以用代理对象访问远端的之前已经写好和处理好的方法了,这样就可以返回数据,供我们按到进行使用。最后,为了提高我们的代码质量,我们需要在取消绑定时释放变量内存资源。

      上面是文字说明。下面一并把自己写的简单的小例子贴上来:有兴趣的,想看的,可以去git上面clone,自己看一下。
      AidlDemo例子Git仓库地址:https://github.com/yuxinburen/AidlDemo.git
      git命令:git clone https://github.com/yuxinburen/AidlDemo.git  即可克隆到本地然后导入查看.


     进程间通讯传递数据有一些特别的要求和限制: 
具体情况为:
1. Java 的原生类型
2. String 和CharSequence
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型;  以上三种类型都不需要导入(import)
4. AIDL 自动生成的接口  需要导入(import)
5. 实现android.os.Parcelable 接口的类.  需要导入(import)。 



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 建学校土地手续怎么办 德国预科不能毕业怎么办 想出国打工怎么办手续 终结执行了该怎么办 网银界面打不开怎么办 abr检查结果异常怎么办 大排畸胎儿位置不好怎么办 交社保中途死了怎么办 不知道社保密码怎么办 社保卡没有信息怎么办 医保卡没有信息怎么办 信访局不受理怎么办 没身份证怎么办健康证 海峡银行怎么办医保卡 小学借读生学籍怎么办 光头也有头皮屑怎么办 情侣没话题了怎么办 月经前后有异味怎么办 头发里有湿疹怎么办 公务员退休职业年金怎么办 迅雷打不开怎么办安卓 苹果迅雷闪退怎么办 青羊区爱君家政欺骗学员怎么办 工地拿不到钱怎么办 包工头拿不到工程款怎么办 华夏盾密码错六次怎么办 怀孕六个月有孕纹了怎么办 课堂上不会讲课怎么办 怀孕吃薏米粥怎么办 吃了薏米肚子痛怎么办 孕期吃了薏米怎么办 怀孕误食薏米水怎么办 薏米吃多了怎么办 花生米炸糊了怎么办 经期吃了薏米怎么办 身体湿气很重怎么办 肠胃不好湿气重怎么办 我湿气特别重怎么办 脾胃不好湿气重怎么办 孕妇身体有湿气怎么办 孕妇身上有湿气怎么办