[置顶] Android进程间通信AIDL的使用分析
Android进程间通信AIDL的使用:
1、简介
在Android当中,线程之间是不能进行相互传递信息,不能共享彼此的内存空间的,所以Android提供了AIDL来实现。
AIDL(AndroidInterfaceDefinitionLanguage)是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocesscommunication,IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
对于AIDL的具体语法及使用,请查看文档:http://developer.android.com/guide/components/aidl.html这里有详细的说明。
2、使用
下面举个简单的例子,意在说明AIDL的使用,并没有实际的用途。例子是这样的,我们提供服务端和客户端两个项目,他们各自运行在自己的进程中,我们来实现他们之间的交互通信过程,当然,在客户端简单实现点击按钮,由服务端返回欢迎语“HELLOAIDL!”,具体如下:
服务端:
在服务端我们提供AIDL接口及服务的Service,并将该Service与AIDL金星绑定,实时监听请求。
AIDHelloService.aidl:
interfaceAIDLHelloService{
StringsayHelloAidl();
}
RemoteService.java:
publicclassRemoteServiceextendsService{
privatefinalAIDLHelloService.Stubbinder=newAIDLHelloService.Stub(){
@Override
publicStringsayHelloAidl()throwsRemoteException{
return"HELLOAIDL!";
}
};
@Override
publicIBinderonBind(Intentarg0){
returnbinder;
}
}
当然,这个Service就是当客户端点击请求的时候,返回欢迎语“HELLOAIDL!”给客户端。当编辑并保存了aidl之后,会在gen目录下自动生成aidl对应的.java文件。
客户端:
在客户端中,我们只需要提供请求的点击事件及负责连接不同进程间的服务连接器ServiceConnection,使用它来与另外的其它进行进行通信即可。因为客户端和服务端进行通信是使用相同的AIDL进行通信的,所以我们只需要将服务端实现的aidl的包复制到客户端的SRC目录下即可,接下来是具体的实现代码。
客户端请求点击事件:
publicclassAIDLHelloClientActivityextendsActivity{
privateAIDLHelloServiceaidlService;
privatestaticbooleanisServiceBound=false;
privateServiceConnectionconn=newServiceConnection(){
@Override
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
try{
aidlService=AIDLHelloService.Stub.asInterface(service);
}catch(Exceptione){
e.printStackTrace();
return;
}
}
@Override
publicvoidonServiceDisconnected(ComponentNamename){
aidlService=null;
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidlhello_client);
if(isServiceBound){
unbindService(conn);
}else{
Intentintent=newIntent("com.demo.aidlhelloserver.service.RemoteService");
bindService(intent,conn,Context.BIND_AUTO_CREATE);
}
isServiceBound=!isServiceBound;
}
publicvoidsayHelloAidl(Viewv){
if(null!=aidlService){
try{
Toast.makeText(this,aidlService.sayHelloAidl(),
Toast.LENGTH_SHORT).show();
}catch(RemoteExceptione){
e.printStackTrace();
return;
}
}
}
下面为运行的效果图:
服务端:
客户端:
好了,到这我们已经实现了AIDL的使用介绍。
3、注意
A、服务端的Service要记得注册
AndroidManifest.xml:
<!--服务注册-->
<service
android:name=".service.RemoteService">
<intent-filter>
<actionandroid:name="com.demo.aidlhelloserver.service.RemoteService"/>
</intent-filter>
</service>
B、复制服务端的AIDL到客户端
C、如果在gen下没有生成.aidl对应的.java文件,则将项目clean下重新编译即可。
/*
* Android技术交流群号:179914858
*欢迎加入
*/
更多相关文章
- Android(安卓)网络编程
- android 自带的主题 theme 的使用
- android:windowSoftInputMode属性使用
- Android(安卓)中 CheckBox 的基本使用
- 使用ListView实现网上订餐首页
- 【转】Android自定义属性,attr format取值类型
- Android(安卓)SeekBar自定义使用图片和颜色显示
- Android进度条控件ProgressBar使用
- Android(安卓)使用PdfDocument生成PDF文件及遇到的问题