我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用。
理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧。
今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子。
在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现跨进程通信,我们需要至少有2个进程,一个代表服务端,一个代表客户端,所以我们会创建2个项目,来分别代表服务端和客户端。
服务端是提供服务的,得先提供服务,才能让客户端来享受服务,对吧。
服务端
我们创建一个服务端的项目,然后创建我们的aidl文件,毕竟只是一个Demo,所以我先从简单入手,方法不要太多,就叫IDemoService.aidl, 如下:
package com.lms.service;
interface IDemoService {
void invoke();
}
我们将其放在com.lms.service的包名目录下,表明其是提供服务的,当我们编译一下项目之后,就会发现在gen目录下面同样的包名下,生成了一个IDemoService.java的文件,如下:
而其生成的IDemoService.java文件内容如下,跟上一篇文章中所展现的其实一样,就是一个Stub类和一个Proxy类,如下:
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: F:\\workspace_android\\AidlDemoClient\\src\\com\\lms\\service\\IDemoService.aidl
*/
package com.lms.service;
public interface IDemoService extends android.os.IInterface {
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements
com.lms.service.IDemoService {
private static final java.lang.String DESCRIPTOR = "com.lms.service.IDemoService";
/** Construct the stub at attach it to the interface. */
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.lms.service.IDemoService
* interface, generating a proxy if needed.
*/
public static com.lms.service.IDemoService asInterface(
android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof com.lms.service.IDemoService))) {
return ((com.lms.service.IDemoService) iin);
}
return new com.lms.service.IDemoService.Stub.Proxy(obj);
}
@Override
public android.os.IBinder asBinder() {
return this;
}
@Override
public boolean onTransact(int code, android.os.Par