RPC & AIDL
一般创建的服务并不能被其他的应用程序访问。为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。
Android使用AIDL来实现。
每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自己的操作,都在自己的那片狭小的空间里过完自己的一生。每个进程之间都你不知我,我不知你,就像是隔江相望的两座小岛一样,都在同一个世界里,但又各自有着自己的世界。而AIDL,就是两座小岛之间沟通的桥梁。相对于它们而言,我们就好像造物主一样,我们可以通过AIDL来制定一些规则,规定它们能进行哪些交流。
何时使用AIDL是必要的:只有你允许客户端从不同的应用程序为了进程间的通信而去访问你的service。
Binder RPC 机制
1.client通过获得一个server的代理接口,对server进行直接调用;
2.代理接口中定义的方法与server中定义的方法是一一对应的;
3.client调用某个代理接口中的方法时,代理接口的方法会将client传递的参数打包成为Parcel对象;
4.代理接口将该Parcel发送给内核中的binder driver.
5.server会读取binder driver中的请求数据,如果是发送给自己的,解包Parcel对象,处理并将结果返回;
6.整个的调用过程是一个同步过程,在server处理的时候,client会block住。
应用层AIDL的使用方法
服务端步骤步骤
1.建立AIDL,自动生成java接口
Java包目录中建立一个扩展名为A.aidl的文件,并写下需要的接口。如果aidl文件的内容是正确的,ADT会在gen目录下自动生成一个A.Java接口文件。
2. 实现service
建立一个服务类(Service的子类)
public class MyService extends Service
创建的服务类中创建一个内部类,实现由aidl文件生成的Java接口
MyServiceImpl
服务类的onBind方法返回时,将实现aidl接口的内部类对象返回出去
return new MyServiceImpl();
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return new MyServiceImpl();
}
public class MyServiceImpl extends IMyService.Stub
{
public String funcXXX
{
}
}
}
<