面试官开口说:“听你刚才所说,在Android系统中,都是利用Binder来进行进程间通信的,那我怎么听说,还有利用AIDL来实现进程间通信的呢?”。
其实,AIDL只是一种描述性语言,其全称是Android Interface Definition Language,即接口定义语言,利用ADT,我们可将自定义的AIDL文件转化成Java代码,而这些代码就能够来进行进程间通信(IPC)。为什么这些代码就能够进行IPC呢?那是因为,这些代码就是定义了Binder机制中作为服务端的Binder对象和客户端中用的Proxy对象。
在前面的文章中,我们讲过,作为服务端的服务,会在本线程中创建一个Binder对象,并将其引用传递给Binder驱动,而客户端通过Binder驱动获得对应的Binder对象的引用时,其获得的其实是一个Proxy对象,然后其通过这个Proxy对象去跟驱动,再由驱动去跟服务端的Binder对象进行通信。
而通过AIDL生成的代码,我们就可以从代码的层面来帮助我们更好地理解关于Binder机制的作用了。
看来,面试变成了上机操作。。。
我们还是先写一份AIDL文件,定义一个接口和对应的方法。
首先,我为什么是定义接口呢?仔细想想,其实在不同的进程中进行通信,无非就是想使用彼此的服务,而服务的一个非常好的表现形式就是对接口编程,也就是说,我们只需要知道服务提供的名称是什么,需要什么参数,而具体服务端怎么实现,我们并不关心。当服务端改变了实现,它也只需要保持接口的一致性,就不会影响客户端的使用。
package com.lms.aidl;
import java.util.List;
import com.lms.aidl.Bean;
interface ITestService {
List<Bean> getBean();
void addBean(in Bean bean);
}
看起来很像Java中的接口嘛。
利用ADT插件,在Eclipse中会生成如下的java代码
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: ...\\AidlServer\\src\\com\\lms\\aidl\\ITestService.aidl
*/
package com.lms.aidl;
public interface ITestService extends android.os.IInterface {
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements
com.lms.aidl.ITestService {
private static final java.lang.String DESCRIPTOR = "com.lms.aidl.ITestService";
/** Construct the stub at attach it to the interface. */
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.lms.aidl.ITestService interface,
* generating a proxy if needed.
*/
public static com.lms.aidl.IT

最低0.47元/天 解锁文章
1708





