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;

}

}

}

下面为运行的效果图:

服务端:

[置顶] Android进程间通信AIDL的使用分析_第1张图片

客户端:

[置顶] Android进程间通信AIDL的使用分析_第2张图片

好了,到这我们已经实现了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到客户端

[置顶] Android进程间通信AIDL的使用分析_第3张图片

C、如果在gen下没有生成.aidl对应的.java文件,则将项目clean下重新编译即可。

/*

* Android技术交流群号:179914858

*欢迎加入

*/

更多相关文章

  1. Android 使用Json实现服务器与客户端数据的交互
  2. android 嵌入服务端页面二 之WebView与页面互调
  3. android后台进程隐藏手段
  4. 面向UDP的Android——PC双向通信(三):在Android客户端和PC服务器端
  5. Android跨进程通信之Proxy与Stub(三)

随机推荐

  1. Android(安卓)椭圆路径 长按暂停动画的实
  2. android 中无法使用LOGE显示log
  3. 文本中的值的保存与恢复
  4. Android(安卓)Studio jcenter集成butterk
  5. Android(安卓)studio使用教程
  6. 1 android 人脸识别
  7. Android(安卓)Content Provider Guides
  8. 模拟获取android root权限
  9. 横竖屏切换不重启activity的方法
  10. Android(安卓)premission 访问权限代码