【Android個人理解(八)】跨應用調用不同組件的方法
如果情景:
創建兩個應用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個人理解(八)】跨應用調用不同組件的方法