使用AIDL设计远程接口(Designing a Remote Interface Using AIDL)
由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。
通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作。
AIDL (Android Interface Definition Language)是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
使用AIDL步骤:
1.首先编写AIDL接口文件,其实就是一个java接口只不过把后缀名改为.aidl。
1 --forActivity.aidl-- 2 package com.example.aidl; 3 interface forActivity{ 4 void performAction(); 5 void logStartService(); 6 void logCloseService(); 7 } 8 9 --forService.aidl-- 10 package com.example.aidl; 11 import com.example.aidl.forActivity; 12 interface forService{ 13 void registerTestCall(forActivity cb); 14 void invokCallBack(); 15 }
2.生成.aidl文件对应的java文件
- 如果使用Eclipse编写.aidl文件,Eclipse集成的ADT工具会自动帮我们生成.java文件存放在gen文件夹下
- 如果使用aidl.exe命令生成.java文件,则通过android-sdk-windows/platform-tools/aidl.exe
-I: search path for import statements. --包的根目录
-d: generate dependency file. --生成奴属文件路径,即将forService.aidl中依赖的.aidl文件路径输入到aidl_dependency.txt文件中。在编译IRemoteService.aidl时,通过使用"-d"可以将其依赖的相关类输出到自定义的文件中.
D:\workspace\2013_11_12_AIDL\src\com\example\aidl\forService.java: \
D:\workspace\2013_11_12_AIDL\src\com\example\aidl\forService.aidl \
D:\workspace\2013_11_12_AIDL\src\com\example\aidl\forActivity.aidl
注意:-I与D:\workspace\***之间是没有空格的,-d后面也没有空格。
3.根据生成的java文件,就可以在我们的Activity中通过使用Stub来访问远端的Service进程,实现跨进程通信。(具体实现看下面的例子)
参考:http://android.blog.51cto.com/268543/537684
http://www.cnblogs.com/over140/archive/2011/03/08/1976890.html
http://blog.csdn.net/saintswordsman/article/details/5130947