Android进程间通信AIDL的使用:
1、简介
在Android当中,线程之间是不能进行相互传递信息,不能共享彼此的内存空间的,所以Android提供了AIDL来实现。
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
对于AIDL的具体语法及使用,请查看文档:http://developer.android.com/guide/components/aidl.html这里有详细的说明。
2、使用
下面举个简单的例子,意在说明AIDL的使用,并没有实际的用途。例子是这样的,我们提供服务端和客户端两个项目,他们各自运行在自己的进程中,我们来实现他们之间的交互通信过程,当然,在客户端简单实现点击按钮,由服务端返回欢迎语“HELLO AIDL!”,具体如下:
服务端:
在服务端我们提供AIDL接口及服务的Service,并将该Service与AIDL金星绑定,实时监听请求。
AIDHelloService.aidl:
interface AIDLHelloService {
String sayHelloAidl();
}
RemoteService.java:
public class RemoteService extends Service {
private final AIDLHelloService.Stub binder = new AIDLHelloService.Stub() {
@Override
public String sayHelloAidl() throws RemoteException {
return "HELLO AIDL!";
}
};
@Override
public IBinder onBind(Intent arg0) {
return binder;
}
}
当然,这个Service就是当客户端点击请求的时候,返回欢迎语“HELLO AIDL!”给客户端。当编辑并保存了aidl之后,会在gen目录下自动生成aidl对应的.java文件。
客户端:
在客户端中,我们只需要提供请求的点击事件及负责连接不同进程间的服务连接器ServiceConnection,使用它来与另外的其它进行进行通信即可。因为客户端和服务端进行通信是使用相同的AIDL进行通信的,所以我们只需要将服务端实现的aidl的包复制到客户端的SRC目录下即可,接下来是具体的实现代码。
客户端请求点击事件:
public class AIDLHelloClientActivity extends Activity {
private AIDLHelloService aidlService;
private static boolean isServiceBound = false;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
aidlService = AIDLHelloService.Stub.asInterface(service);
} catch(Exception e) {
e.printStackTrace();
return;
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
aidlService = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidlhello_client);
if(isServiceBound) {
unbindService(conn);
} else {
Intent intent = new Intent("com.demo.aidlhelloserver.service.RemoteService");
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
isServiceBound = !isServiceBound;
}
public void sayHelloAidl(View v) {
if(null != aidlService) {
try {
Toast.makeText(this, aidlService.sayHelloAidl(),
Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
return;
}
}
}
下面为运行的效果图:
服务端:
客户端:
好了,到这我们已经实现了AIDL的使用介绍。
3、注意
A、服务端的Service要记得注册
AndroidManifest.xml:
<!-- 服务注册 -->
<service
android:name=".service.RemoteService">
<intent-filter>
<action android:name="com.demo.aidlhelloserver.service.RemoteService" />
</intent-filter>
</service>
B、复制服务端的AIDL到客户端
C、如果在gen下没有生成.aidl对应的.java文件,则将项目clean下重新编译即可。
/*
* Android技术交流群号:179914858
* 欢迎加入
*/