理解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的另一個目的是對用戶端只聲明介面及方法,隱藏掉具體實作類別,供用戶端直接擷取此介面執行個體。