«

Android进程间通信--AIDL

时间:2024-3-2 17:43     作者:韩俊     分类: Android


本文讲解AIDL的基本使用,通过本文的学习你应该掌握如下内容:
1.了解Android进程间通信IPC(interprocess Communication);
2.学会AIDL的基本使用方法,实现在进程间通信。

  我们先看下Android对AIDL的描述:


在这段描述中我们可以看到,AIDL实际上是接口定义语言(IDL)的一种而这种就是由Android定义的。在第二段我们可以看到,在Android中通常不允许一个进程访问另外一个进程的数据,所以这个时候我们就许需要使用AIDL来帮助我们完成这项工作。当然有人会说,我们可以在一个进程把数据写入文件或数据库,而另外一个进程去文件或数据库中读取。实际上这种理解是错误的,这种只适合进程在同一个应用中的情况,如果两个进程不在同一个应用中就不行了,因为Android不允许直接跨应用访问。

  下面我们看下AIDL的使用,首先我们用server和client代表两个不同的进程并且两个进程在两个应用中。AIDL的使用server端有三步,client端也有三步,总共六步,我们先讲server的三步:
  <strong>1.创建.aidl文件:</strong>AIDL支持Java语言的基本类型(int, boolean, String, long, List等),但如果像这样的List&lt;Student&gt;或只单独传递一个Student就需要加入Student的import语句。(Student为自定义的对象)


如上图所示,在这个aidl文件中我既使用了基本的数据类型(String)又使用了自定义的数据类型(Student),可以看到在使用了自定义的数据类型后要把这个数据类型import到这个文件中,不然aidl无法找到这个数据类型。同时由于使用了自定义的数据类型我们还需要专门为这个数据类型写一个aidl文件并且文件名和自定义数据类型的类名保持一致,内容如下:

上图你看到我们自定义的数据类型Student,为了能在aidl使用自定义的数据类型我们还需要对Student改造下:

其中:
Parcelable.Creator<Student>:具体干什么我还没有完全看懂,怀疑是从序列化中创建Student对象,因为它的方法createFromParcel明显就是从Parcel中重组Student。
writeToParcel():将Student对象序列化。
到这里AIDL的基础工作就做好了,其完整目录结构如下:


  <strong>2.实现aidl接口:</strong>这里我们需要创建一个类来实现我们定义aidl接口,也就是实现我们在上图IStudentService.aidl文件中定义的接口,以便在client连接server时把aidl接口的具体实现传递给client,代码如下:


在这里可以看到,我具体实现了在IStudentService.aidl中定义的接口,将client传入的参数都打印出来。

  <strong>3.创建一个Service:</strong>这个Service让client来启动,这样就能实现client与server进行交互了。代码如下:


在这里,当其他进程通过bindService来启动这个Service时我就第二步aidl接口的具体类的实例返回给其他进程,这样其他进程拿到这个实例就能与Server交互了。另外,创建了Service记得要在manifest中配置下:


<strong> client端的三步为:</strong>
  <strong>1.复制server端创建的.aidl文件:</strong>相当于server与client共同遵守一份协议,具体就是如下目录结构的文件:


  <strong>2.创建一个ServiceConnection类:</strong>这个类实现ServiceConnection接口,而这个接口会在bindService时带上这样当Service连接成功后会回调这个接口的onServiceConnected方法,这样我们就知道service连接成功了从而就可以获取server端我们aidl接口的具体实现类了,代码如下:


这里的mService就是我们获取的server端的aidl接口的具体实现。

  <strong>3.传输数据:</strong>用我们获取server端的aidl接口的具体实现传输数据,这里就是mService。大家可以看到在上一张图中有个方法叫tanslateStudents()方法,里面实际就是调用aidl接口的方法传输数据并返回结果。其具体调用就是我写了几个按钮来触发而已,代码如下:


这里mConnection就是上面ServiceConnection类的一个实例:

而我在按钮中造了3个Student和一句”hello franken!"的语句。

 到此AIDL的基本使用方法就介绍完了,相对于线程间通信进程间通信就要稍微复杂些,希望这篇文章对你理解AIDL有所帮助。另外,由于不知道怎么在文章中加入完整工程代码,需要完整代码的同学请到http://download.csdn.net/download/fengzhonghen/8717807下载。

标签: android

热门推荐