【Android个人理解(八)】跨应用调用不同组件的方法
如果情景:
創(chuàng)建兩個應(yīng)用appA和appB,appA包括一個Service,此Service有一個堵塞方法每隔10秒鐘產(chǎn)生一個隨機(jī)數(shù)字,例如以下: public int getRandomInt(){Thread.sleep(10000);return someRandomInt; }appB調(diào)用appA中Service.getRandomInt()的方法,將數(shù)字顯示在界面上.
解決方式:
我們都知道。從層次上,大體能夠分進(jìn)程,任務(wù),組件。線程。Android系統(tǒng)使得開發(fā)人員對于任務(wù)、組件界限相對清晰,而對于進(jìn)程具有進(jìn)程托管的說法,而對于線程就全然是開發(fā)人員自己的問題,Android系統(tǒng)沒有做太多的約束。
因?yàn)轭}目相對簡單,組件僅僅有一個appB的Activity和一個appA的Service,因此我們的層次關(guān)系為:
進(jìn)程??????? 線程?? ?????組件??
1、若兩個組件在同一進(jìn)程中:
通過設(shè)置<process>屬性,將相關(guān)應(yīng)用,塞進(jìn)一個進(jìn)程,使得它們能夠同生共死,擁有共同的內(nèi)存區(qū)域。
由于問題要求每隔10秒進(jìn)行一次通信,屬密集操作。這樣能夠節(jié)省開支。
自己定義接口:
1)???????自己定義一個接口。該接口中有一個得到隨機(jī)數(shù)的空方法。
2)???????Server端用一個類繼承自Binder并實(shí)現(xiàn)該接口。覆寫了得到隨機(jī)數(shù)的空方法。
3)???????Client端通過ServiceConnection獲取到該類的對象。從而可以使用該獲取當(dāng)前下載進(jìn)度的方法,終于實(shí)現(xiàn)實(shí)時交互。
4)???????Server端重寫onBind()方法,返回binder對象。
5)???????Activity中重寫onServiceConnected獲得Service對象。
6)???????開一個后臺線程。用Service對象調(diào)用getRandomInt()。
7)???????通過Handler將數(shù)據(jù)返回給主線程,更新View。
(另開一個后臺線程的原因是getRandomInt()里的方法sleep(10000)會使main線程休眠。造成界面卡頓。
事實(shí)上這樣使Service組件浪費(fèi)。最好的方式是啟動Service。然后再進(jìn)行通信)
2、若兩個組件不在同一進(jìn)程中:
?????? 設(shè)置<process>屬性,劃分到不同的進(jìn)程
?????? RPC即Remote Procedure Call遠(yuǎn)程進(jìn)程調(diào)用。而Android的進(jìn)程間的通信是通過AIDL服務(wù)實(shí)現(xiàn)。以Binder為基礎(chǔ)的IPC是RPC的一部分。
1)???????在Eclipseproject的package文件夾中建立一個擴(kuò)展名為aidl的文件。aidl文件里定義的是AIDL服務(wù)的接口。即面向接口的編程。同上含有g(shù)etRandomInt()的空方法。
2)???????建立一個服務(wù)類(Service的子類)。
實(shí)現(xiàn)由aidl文件生成的getRandomInt()。
3)???????在AndroidManifest.xml文件里配置AIDL服務(wù)。即在Service中intent-filter標(biāo)簽下聲明。
4)???????在appB的Activity內(nèi)開一個后臺線程,線程內(nèi)創(chuàng)建ServiceConnection對象??,獲得AIDL服務(wù)對象?,調(diào)用getRandomInt()方法。
5)???????通過Handler將數(shù)據(jù)返回給主線程,更新View。
(與單進(jìn)程類似)
?
假設(shè)單純實(shí)現(xiàn)組件之間的通信,而不是調(diào)用另個組件的方法,能夠有很多其它方式:
在同一進(jìn)程中:
1)在appA的manifest文件里設(shè)置Service的Android:exported="true"。
2)appB的Activity設(shè)置監(jiān)聽事件,通過startService()發(fā)送intent的方式調(diào)用啟動appA的Service。
然后通過Handler、SharedPreferences等方式線程間傳遞數(shù)據(jù)。
而在不同一進(jìn)程中:
能夠使用Boradcast。ContentProvider。Mssenger(信使)交互方式進(jìn)行跨進(jìn)程的數(shù)據(jù)傳遞。
總結(jié)
以上是生活随笔為你收集整理的【Android个人理解(八)】跨应用调用不同组件的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA反射+SOCKET实现远程方法调
- 下一篇: 【Android】Android程序自己