Android中进程间通信机制AIDL

  学习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)。 



没有更多推荐了,返回首页