android aidl

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述android aidl相关的知识,希望能为你提供帮助。

参考: http://blog.csdn.net/u014614038/article/details/48399935

本文提供了一个关于AIDL使用的简单易懂的例子,分为客户端和服务端两部分,分别为客户端和服务端新建一个eclipse工程,实现了从客户端向服务端发送请求,服务端打印log的功能。
 
客户端和服务端的源码结构如下:
android aidl

文章图片
android aidl

文章图片

注意,由于客户端和服务端的aidl文件所在包名必须一样,而两个包名一样的程序在安装时会产生冲突,所以这里用了一个技巧,在客户端工程的androidManifest.xml里把包名指定为com.styleflying,所以大家就会看到gen目录下的R.java所在的包是com.styleflying而不是com.styleflying.AIDL
 
整个交互流程如下:
1.客户端通过绑定服务,获取了服务的句柄(本地代理对象);
2.客户端执行onClick(),调用本地代理对象的invokTest()函数,本地代理对象调用mRemote.transact()发出远程调用请求(见    mInterface.java);
3.服务端响应onTransact()执行this.invokTest(),并将执行结果返回;
 
由于客户端只和本地代理对象即服务句柄通信,由代理对象进行真正的IPC操作,所以对客户端来说,IPC过程是透明的,调用远程操作如同调用本地操作一样。
【android aidl】在客户端调用transact()时,会将服务描述DSCRIPTION写入到data里,在客户端onTransact时会验证,如果两个不一样,则不能通信。
而DSCRIPTION是根据mInterface包名和接口名自动生成的,这就是为什么两个工程里的mInterface.aidl要在同一个包的原因。
 
在这个过程中,mInterface.aidl起到了桥梁的作用,规定统一了客户端和服务端的通信接口,使得客户端和服务端得以成功的通信。
具体的通信transact和onTransact的过程也就是利用Binder驱动通信的过程,在这里就不多叙述。
最后补上两个工程的AndroidManifest.xml
 
[java]  view plain  copy     print?
  1. < ?xml  version="1.0"  encoding="utf-8"?>    
  2. < manifest  xmlns:android="http://schemas.android.com/apk/res/android"   
  3.             package="com.styleflying"   
  4.             android:versionCode="1"   
  5.             android:versionName="1.0">    
  6.         < application  android:icon="@drawable/icon"  android:label="@string/app_name">    
  7.                 < activity  android:name=".AIDL.mAIDLActivity"   
  8.                                     android:label="@string/app_name">    
  9.                         < intent-filter>    
  10.                                 < action  android:name="android.intent.action.MAIN"  />    
  11.                                 < category  android:name="android.intent.category.LAUNCHER"  />    
  12.                         < /intent-filter>    
  13.                 < /activity>    
  14.         < /application>    
  15.         < uses-sdk  android:minSdkVersion="8"  />    
  16. < /manifest>      
 
[java]  view plain  copy     print?
  1. < ?xml  version="1.0"  encoding="utf-8"?>    
  2. < manifest  xmlns:android="http://schemas.android.com/apk/res/android"   
  3.             package="com.styleflying.AIDL"   
  4.             android:versionCode="1"   
  5.             android:versionName="1.0">    
  6.         < application  android:icon="@drawable/icon"  android:label="@string/app_name">    
  7.                 < service  android:name=".mAIDLService">    
  8.                                 < intent-filter>    
  9.                                 < action  android:name="com.styleflying.AIDL.service"  />    
  10.                                 < category  android:name="android.intent.category.DEFAULT"  />    
  11.                         < /intent-filter>    
  12.                 < /service>    
  13.         < /application>    
  14.         < uses-sdk  android:minSdkVersion="8"  />    
  15. < /manifest>    
http://blog.csdn.net/u014614038/article/details/48399935

    推荐阅读