日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android个人理解(八)】跨应用调用不同组件的方法

發(fā)布時間:2025/3/20 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android个人理解(八)】跨应用调用不同组件的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果情景:

創(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。