理解Android系统的进程间通信原理(一)----RPC中的代理模式
Android系统中的进程间通信是通过一个轻量级的RPC(Remote Procedure Call远程进程调用)和AIDL(Android Interface Definination Language)规范来生成两个进程之间可以相互访问的代码。其中RPC是以接口方式来实现,客户端与被调用实现之间是通过代理模式来实现的,这些又是 以JAVA的RMI和代理模式为理论基础的,若要灵活掌握这个轻量级的解决方案,有必要重新理顺这些基础知识的,这里我们先了解代理模式的相关基础,
有关代理模式的知识,可以用下面这个思维导图来表示:
这里以一个代码实例来说明实际运用:
1、抽象类Role代码
package
com.magc.proxy;
/**
*代理角色和真实角色的共同抽象类
*/
public abstract
class
Role {
//
作为代理角色和真实角色的共同接口,方便代理角色对外代替真实角色来提供服务
public abstract
void
service(String user_id);
}
2、真实角色类RealRole代码
package com.magc.proxy;
/**
4
*
@author
magc
5
* 真实角色类
6
* 对外是不可访问
7
*
8
*/
9
public
class
RealRole
extends
Role {
10
11
/*
(non-Javadoc)
12
* @see com.magc.proxy.Role#service()
13
* 提供服务
14
*/
15
@Override
16
public
void
service(String user_id) {
17
System.out.println(
"
真实角色为你服务……
"
);
18
}
19
//
验证用户身份
20
public
boolean
CheckUser(String user_id)
21
{
22
return
true
;
23
}
24
25
}
3、代理类ProxyRole代码:
1 package
com.magc.proxy;
2
3
/**
4
*
@author
magc
5
* 代理角色类
6
* 对客户端开发其接口
7
* 内部可以直接引用真实角色实例,将客户端的请求转给真实角色实例
8
* 对转发请求的前或者后面可以增加一些额外操作
9
*/
10
public
class
ProxyRole
extends
Role {
11
private
RealRole realrole
=
null
;
12
13
/*
(non-Javadoc)
14
* @see com.magc.proxy.Role#service()
15
*/
16
@Override
17
public
void
service(String user_id) {
18
System.out.println(
"
代理角色为你服务……
"
);
19
//
需要时才去创建真实角色实例
20
realrole
=
new
RealRole();
21
//
增加额外操作:验证身份
22
System.out.println(
"
验证身份……
"
);
23
if
(
!
realrole.CheckUser(user_id))
24
return
;
25
System.out.println(
"
去找真实角色实例帮忙处理事务……
"
);
26
realrole.service(
"
magc
"
);
27
28
System.out.println(
"
谢谢光临……
"
);
29
}
30
31
}
4、测试类RoleTest类代码
1 package
com.magc.proxy;
2
3
/**
4
*
@author
magc
5
* 代理模式测试类
6
* 作为客户端去请求调用代理类的接口。
7
* 客户端只能访问代理类,而不能访问真实角色类
8
*/
9
public
class
ProxyTest {
10
11
/**
12
*
@param
args
13
*/
14
public
static
void
main(String[] args) {
15
16
ProxyRole proxy
=
new
ProxyRole();
17
proxy.service(
"
magc
"
);
18
}
19
20
}
运行测试类,控制台输出结果为:
由于时间仓促,错误难免,希望能给大家有所启示,也算是在这里抛砖引玉了,呵呵
(二)
理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用)。有关RMI的相关知识,可以通过下图来归纳:
Android中的RPC也是参考了JAVA中的RMI方案,这里我们再详细了解一下RPC的实现过程。
Android中的RPC机制是为了实现一个进程使用另一个进程中的远程对象,它使用了Android自己的AIDL(接口定义语言),使用户很方 便地定义出一个接口作为规范,通过一个远程Service为代理 ,客户端在绑定该远程Service过程中获取远程对象,进而使用该对象。可参考下图所示:
补充:RPC的另一个目的是对客户端只声明接口及方法,隐藏掉具体实现类,供客户端直接获取此接口实例。