淺談Android Activity與Service的交互方式
實現(xiàn)更新下載進(jìn)度的功能

1. 通過廣播交互
Server端將目前的下載進(jìn)度,通過廣播的方式發(fā)送出來,Client端注冊此廣播的監(jiān)聽器,當(dāng)獲取到該廣播后,將廣播中當(dāng)前的下載進(jìn)度解析出來并更新到界面上。
優(yōu)缺點分析:
通過廣播的方式實現(xiàn)Activity與Service的交互操作簡單且容易實現(xiàn),可以勝任簡單級的應(yīng)用。但缺點也十分明顯,發(fā)送廣播受到系統(tǒng)制約。系統(tǒng)會優(yōu)先發(fā)送系統(tǒng)級廣播,在某些特定的情況下,我們自定義的廣播可能會延遲。同時在廣播接收器中不能處理長耗時操作,否則系統(tǒng)會出現(xiàn)ANR即應(yīng)用程序無響應(yīng)
2. 共享文件交互
這里提到的共享文件指的是Activity和Service使用同一個文件來達(dá)到傳遞數(shù)據(jù)的目的。我們使用SharedPreferences來實現(xiàn)共享,當(dāng)然也可以使用其它IO方法實現(xiàn),通過這種方式實現(xiàn)交互時需要注意,對于文件的讀寫的時候,同一時間只能一方讀一方寫,不能兩方同時寫
優(yōu)缺點分析:
對於這種方式實現(xiàn)Activity與Service的交互,可以說很方便,就像使用管道,一個往裡寫,一個往外讀。但這種方式也有缺陷,寫入數(shù)據(jù)較為復(fù)雜以及數(shù)據(jù)量較大時,就有可能導(dǎo)致寫入與讀數(shù)據(jù)出不一致的錯誤。同時因為經(jīng)過了一個中轉(zhuǎn)站,這種操作將更耗時。
3. Messenger交互(信使交互) Handler
Messenger翻譯過來指的是信使,它引用了一個Handler對象,別人能夠向它發(fā)送消息(使用mMessenger.send(Message msg)方法)。該類允許跨進(jìn)程間基于Message通信,在服務(wù)端使用Handler創(chuàng)建一個 Messenger,客戶端只要獲得這個服務(wù)端的Messenger對象就可以與服務(wù)端通信了。也就是說我們可以把Messenger當(dāng)做Client端與Server端的傳話筒,這樣就可以溝通交流了
優(yōu)缺點分析:
通過Messenger來實現(xiàn)Activity和Service的交互,稍微深入一點我們就可以知道,其實Messenger也是通過AIDL來實現(xiàn)的。對於前兩種實現(xiàn)方式,Messenger方式總體上來講也是比較容易理解的,這就和平時使用Handler和Thread通信一個道理。
4. Server中自定義接口交互
自定義一個接口,該接口中有一個獲取當(dāng)前下載進(jìn)度的空方法。Server端用一個類繼承自Binder并實現(xiàn)該接口,覆寫了其中獲取當(dāng)前下載進(jìn)度的方法。Client端通過ServiceConnection獲取到該類的對象,從而能夠使用該獲取當(dāng)前下載進(jìn)度的方法,最終實現(xiàn)實時交互。
public interface ICountService {
public int getCurrentLoad();
}
public class DownLoadService extends Service implements ICountService{
private ServiceBinder serviceBinder = new ServiceBinder();
public class ServiceBinder extends Binder implements ICountService{
@Override
public int getCurrentLoad() {
Log.i(TAG, "ServiceBinder getCurrentLoad()... i=:"+i);
return i;
}
}
@Override
public int getCurrentLoad() {
return 0;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "DownLoadService.onBind()...");
return serviceBinder;
}
Client端的Timer在bindService()完成之后1秒再開始獲取下載進(jìn)度,獲取方法是直接通過int curLoad = iCountService.getCurrentLoad();這里的getCurrentLoad()方法是DownLoadService內(nèi)部類ServiceBinder中的方法。Client端將獲取到的下載進(jìn)度更新到介面上并更新進(jìn)度條。
優(yōu)缺點分析:
這種方法簡單實用,擴(kuò)展性強(qiáng),但其也有一些缺點,比如需要延遲一些再開始獲取Server端的數(shù)據(jù),從而無法完全實現(xiàn)從零開始同步更新。綜其所述,通過自定義接口實現(xiàn)Activity與Service交互的方法還是比較實用的。適用於同進(jìn)程中通信,不能進(jìn)行跨進(jìn)程通信。
5. AIDL交互
原理: AIDL屬于Android的IPC機(jī)制,常用于跨進(jìn)程通信,主要實現(xiàn)原理基于底層Binder機(jī)制。
優(yōu)缺點分析:
AIDL在Android中是進(jìn)程間通信常用的方式,可能使用較為復(fù)雜,但效率高,擴(kuò)展性好。同時很多系統(tǒng)服務(wù)就是以這種方式完成與應(yīng)用程序通信的。
以上就是小編為大家?guī)淼臏\談Android Activity與Service的交互方式的全部內(nèi)容了,希望對大家有所幫助,多多支持腳本之家~
- Android檢測Activity或者Service是否運行的方法
- Android中Service和Activity相互通信示例代碼
- Android中Service與Activity之間通信的幾種方式
- Android Activity與Service通信(不同進(jìn)程之間)詳解
- Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解
- Android使用Messenger實現(xiàn)service與activity交互
- Android實現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法詳解
- Android實現(xiàn)從activity中停止Service的方法
- Android中Service實時向Activity傳遞數(shù)據(jù)實例分析
- android使用service和activity獲取屏幕尺寸的方法
- 詳解Android Service與Activity之間通信的幾種方式
相關(guān)文章
Android自定義View 使用PathMeasure簡單模仿系統(tǒng)ProgressBar(四)
這篇文章主要為大家詳細(xì)介紹了Android自定義View,使用PathMeasure簡單模仿系統(tǒng)ProgressBar,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Android開發(fā)基于ScrollView實現(xiàn)的漸變導(dǎo)航欄效果示例
這篇文章主要介紹了Android開發(fā)基于ScrollView實現(xiàn)的漸變導(dǎo)航欄效果,涉及ScrollView事件響應(yīng)及元素屬性動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-12-12
Android?WebView的使用與后退鍵處理詳細(xì)討論
在android開發(fā)中我們有時候根據(jù)項目的需求多少會加載一些webview,加載webview,我們有時候會根據(jù)UI來自定義返回鍵,下面這篇文章主要給大家介紹了關(guān)于Android?WebView的使用與后退鍵處理的相關(guān)資料,需要的朋友可以參考下2024-04-04
Android 中LayoutInflater.inflate()方法的介紹
這篇文章主要介紹了Android 中LayoutInflater.inflate()方法的介紹的相關(guān)資料,希望通過本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09
Android?RecyclerLineChart實現(xiàn)圖表繪制教程
這篇文章主要為大家介紹了Android?RecyclerLineChart實現(xiàn)圖表繪制教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Kotlin基礎(chǔ)通關(guān)之字符串與數(shù)字類型
這篇文章主要介紹了Kotlin基礎(chǔ)知識中的字符串與數(shù)字類型,編程中的入門知識,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

