大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述android aidl相关的知识,希望能为你提供帮助。
参考: http://blog.csdn.net/u014614038/article/details/48399935
本文提供了一个关于AIDL使用的简单易懂的例子,分为客户端和服务端两部分,分别为客户端和服务端新建一个eclipse工程,实现了从客户端向服务端发送请求,服务端打印log的功能。
客户端和服务端的源码结构如下:
文章图片
文章图片
注意,由于客户端和服务端的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?
- < ?xml version="1.0" encoding="utf-8"?>
- < manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.styleflying"
- android:versionCode="1"
- android:versionName="1.0">
- < application android:icon="@drawable/icon" android:label="@string/app_name">
- < activity android:name=".AIDL.mAIDLActivity"
- android:label="@string/app_name">
- < intent-filter>
- < action android:name="android.intent.action.MAIN" />
- < category android:name="android.intent.category.LAUNCHER" />
- < /intent-filter>
- < /activity>
- < /application>
- < uses-sdk android:minSdkVersion="8" />
- < /manifest>
[java] view plain copy print?
- < ?xml version="1.0" encoding="utf-8"?>
- < manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.styleflying.AIDL"
- android:versionCode="1"
- android:versionName="1.0">
- < application android:icon="@drawable/icon" android:label="@string/app_name">
- < service android:name=".mAIDLService">
- < intent-filter>
- < action android:name="com.styleflying.AIDL.service" />
- < category android:name="android.intent.category.DEFAULT" />
- < /intent-filter>
- < /service>
- < /application>
- < uses-sdk android:minSdkVersion="8" />
- < /manifest>
推荐阅读
- Android开发之ViewPager的简单使用
- Android 控件知识点
- Android 回调接口是啥,回调机制详解(zhuan)
- Android 开发组件
- Android开发--adb,SQLite数据库运用
- android 一分钟掌握圆形布局原理--圆形菜单控件 so easy
- 信息安全需求简要介绍
- CommVault Systems 2020面试经验分享(校园)
- Traveloka SDE3面试体验详细分享(校园)