理解Android系统的进程间通信原理(一)----RPC中的代理模式


Android系统中的进程间通信是通过一个轻量级的RPC(Remote Procedure Call远程进程调用)和AIDL(Android Interface Definination Language)规范来生成两个进程之间可以相互访问的代码。其中RPC是以接口方式来实现,客户端与被调用实现之间是通过代理模式来实现的,这些又是 以JAVA的RMI和代理模式为理论基础的,若要灵活掌握这个轻量级的解决方案,有必要重新理顺这些基础知识的,这里我们先了解代理模式的相关基础,


有关代理模式的知识,可以用下面这个思维导图来表示:




android megre的使用 android rmi_service


这里以一个代码实例来说明实际运用:


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 megre的使用 android rmi_android megre的使用_02


 


由于时间仓促,错误难免,希望能给大家有所启示,也算是在这里抛砖引玉了,呵呵


(二)


理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用)。有关RMI的相关知识,可以通过下图来归纳:

android megre的使用 android rmi_service_03

Android中的RPC也是参考了JAVA中的RMI方案,这里我们再详细了解一下RPC的实现过程。

Android中的RPC机制是为了实现一个进程使用另一个进程中的远程对象,它使用了Android自己的AIDL(接口定义语言),使用户很方 便地定义出一个接口作为规范,通过一个远程Service为代理 ,客户端在绑定该远程Service过程中获取远程对象,进而使用该对象。可参考下图所示:

android megre的使用 android rmi_分布式应用_04

补充:RPC的另一个目的是对客户端只声明接口及方法,隐藏掉具体实现类,供客户端直接获取此接口实例。