1. 程式人生 > >【Android個人理解(八)】跨應用調用不同組件的方法

【Android個人理解(八)】跨應用調用不同組件的方法

返回 使用 turn 數字 現實 rpc 文件夾 cas rgb

如果情景:

創建兩個應用appA和appB,appA包括一個Service,此Service有一個堵塞方法每隔10秒鐘產生一個隨機數字,例如以下:
public int getRandomInt(){
    Thread.sleep(10000);
    return someRandomInt;
}

appB調用appA中Service.getRandomInt()的方法,將數字顯示在界面上.

解決方式:

我們都知道。從層次上,大體能夠分進程,任務,組件。線程。Android系統使得開發人員對於任務、組件界限相對清晰,而對於進程具有進程托管的說法,而對於線程就全然是開發人員自己的問題,Android系統沒有做太多的約束。

因為題目相對簡單,組件僅僅有一個appB的Activity和一個appA的Service,因此我們的層次關系為:

進程 線程 組件

1、若兩個組件在同一進程中:

通過設置<process>屬性,將相關應用,塞進一個進程,使得它們能夠同生共死,擁有共同的內存區域。

由於問題要求每隔10秒進行一次通信,屬密集操作。這樣能夠節省開支。

自己定義接口:

1) 自己定義一個接口。該接口中有一個得到隨機數的空方法。

2) Server端用一個類繼承自Binder並實現該接口。覆寫了得到隨機數的空方法。

3) Client端通過ServiceConnection獲取到該類的對象。從而可以使用該獲取當前下載進度的方法,終於實現實時交互。

4) Server端重寫onBind()方法,返回binder對象。

5) Activity中重寫onServiceConnected獲得Service對象。

6) 開一個後臺線程。用Service對象調用getRandomInt()。

7) 通過Handler將數據返回給主線程,更新View。

(另開一個後臺線程的原因是getRandomInt()裏的方法sleep(10000)會使main線程休眠。造成界面卡頓。

事實上這樣使Service組件浪費。最好的方式是啟動Service。然後再進行通信)

2、若兩個組件不在同一進程中:

設置<process>屬性,劃分到不同的進程

RPC即Remote Procedure Call遠程進程調用。而Android的進程間的通信是通過AIDL服務實現。以Binder為基礎的IPC是RPC的一部分。

1) 在Eclipseproject的package文件夾中建立一個擴展名為aidl的文件。aidl文件裏定義的是AIDL服務的接口。即面向接口的編程。同上含有getRandomInt()的空方法。

2) 建立一個服務類(Service的子類)。

實現由aidl文件生成的getRandomInt()。

3) 在AndroidManifest.xml文件裏配置AIDL服務。即在Service中intent-filter標簽下聲明。

4) 在appB的Activity內開一個後臺線程,線程內創建ServiceConnection對象 ,獲得AIDL服務對象 ,調用getRandomInt()方法。

5) 通過Handler將數據返回給主線程,更新View。

(與單進程類似)

假設單純實現組件之間的通信,而不是調用另個組件的方法,能夠有很多其它方式:

在同一進程中:

1)在appA的manifest文件裏設置Service的Android:exported="true"。

2)appB的Activity設置監聽事件,通過startService()發送intent的方式調用啟動appA的Service。

然後通過Handler、SharedPreferences等方式線程間傳遞數據。

而在不同一進程中:

能夠使用Boradcast。ContentProvider。Mssenger(信使)交互方式進行跨進程的數據傳遞。


【Android個人理解(八)】跨應用調用不同組件的方法