淺談Android Activity與Service的交互方式
實(shí)現(xiàn)更新下載進(jìn)度的功能
1. 通過(guò)廣播交互
Server端將目前的下載進(jìn)度,通過(guò)廣播的方式發(fā)送出來(lái),Client端注冊(cè)此廣播的監(jiān)聽(tīng)器,當(dāng)獲取到該廣播后,將廣播中當(dāng)前的下載進(jìn)度解析出來(lái)并更新到界面上。
優(yōu)缺點(diǎn)分析:
通過(guò)廣播的方式實(shí)現(xiàn)Activity與Service的交互操作簡(jiǎn)單且容易實(shí)現(xiàn),可以勝任簡(jiǎn)單級(jí)的應(yīng)用。但缺點(diǎn)也十分明顯,發(fā)送廣播受到系統(tǒng)制約。系統(tǒng)會(huì)優(yōu)先發(fā)送系統(tǒng)級(jí)廣播,在某些特定的情況下,我們自定義的廣播可能會(huì)延遲。同時(shí)在廣播接收器中不能處理長(zhǎng)耗時(shí)操作,否則系統(tǒng)會(huì)出現(xiàn)ANR即應(yīng)用程序無(wú)響應(yīng)
2. 共享文件交互
這里提到的共享文件指的是Activity和Service使用同一個(gè)文件來(lái)達(dá)到傳遞數(shù)據(jù)的目的。我們使用SharedPreferences來(lái)實(shí)現(xiàn)共享,當(dāng)然也可以使用其它IO方法實(shí)現(xiàn),通過(guò)這種方式實(shí)現(xiàn)交互時(shí)需要注意,對(duì)于文件的讀寫(xiě)的時(shí)候,同一時(shí)間只能一方讀一方寫(xiě),不能兩方同時(shí)寫(xiě)
優(yōu)缺點(diǎn)分析:
對(duì)於這種方式實(shí)現(xiàn)Activity與Service的交互,可以說(shuō)很方便,就像使用管道,一個(gè)往裡寫(xiě),一個(gè)往外讀。但這種方式也有缺陷,寫(xiě)入數(shù)據(jù)較為復(fù)雜以及數(shù)據(jù)量較大時(shí),就有可能導(dǎo)致寫(xiě)入與讀數(shù)據(jù)出不一致的錯(cuò)誤。同時(shí)因?yàn)榻?jīng)過(guò)了一個(gè)中轉(zhuǎn)站,這種操作將更耗時(shí)。
3. Messenger交互(信使交互) Handler
Messenger翻譯過(guò)來(lái)指的是信使,它引用了一個(gè)Handler對(duì)象,別人能夠向它發(fā)送消息(使用mMessenger.send(Message msg)方法)。該類(lèi)允許跨進(jìn)程間基于Message通信,在服務(wù)端使用Handler創(chuàng)建一個(gè) Messenger,客戶端只要獲得這個(gè)服務(wù)端的Messenger對(duì)象就可以與服務(wù)端通信了。也就是說(shuō)我們可以把Messenger當(dāng)做Client端與Server端的傳話筒,這樣就可以溝通交流了
優(yōu)缺點(diǎn)分析:
通過(guò)Messenger來(lái)實(shí)現(xiàn)Activity和Service的交互,稍微深入一點(diǎn)我們就可以知道,其實(shí)Messenger也是通過(guò)AIDL來(lái)實(shí)現(xiàn)的。對(duì)於前兩種實(shí)現(xiàn)方式,Messenger方式總體上來(lái)講也是比較容易理解的,這就和平時(shí)使用Handler和Thread通信一個(gè)道理。
4. Server中自定義接口交互
自定義一個(gè)接口,該接口中有一個(gè)獲取當(dāng)前下載進(jìn)度的空方法。Server端用一個(gè)類(lèi)繼承自Binder并實(shí)現(xiàn)該接口,覆寫(xiě)了其中獲取當(dāng)前下載進(jìn)度的方法。Client端通過(guò)ServiceConnection獲取到該類(lèi)的對(duì)象,從而能夠使用該獲取當(dāng)前下載進(jìn)度的方法,最終實(shí)現(xiàn)實(shí)時(shí)交互。
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秒再開(kāi)始獲取下載進(jìn)度,獲取方法是直接通過(guò)int curLoad = iCountService.getCurrentLoad();這里的getCurrentLoad()方法是DownLoadService內(nèi)部類(lèi)ServiceBinder中的方法。Client端將獲取到的下載進(jìn)度更新到介面上并更新進(jìn)度條。
優(yōu)缺點(diǎn)分析:
這種方法簡(jiǎn)單實(shí)用,擴(kuò)展性強(qiáng),但其也有一些缺點(diǎn),比如需要延遲一些再開(kāi)始獲取Server端的數(shù)據(jù),從而無(wú)法完全實(shí)現(xiàn)從零開(kāi)始同步更新。綜其所述,通過(guò)自定義接口實(shí)現(xiàn)Activity與Service交互的方法還是比較實(shí)用的。適用於同進(jìn)程中通信,不能進(jìn)行跨進(jìn)程通信。
5. AIDL交互
原理: AIDL屬于Android的IPC機(jī)制,常用于跨進(jìn)程通信,主要實(shí)現(xiàn)原理基于底層Binder機(jī)制。
優(yōu)缺點(diǎn)分析:
AIDL在Android中是進(jìn)程間通信常用的方式,可能使用較為復(fù)雜,但效率高,擴(kuò)展性好。同時(shí)很多系統(tǒng)服務(wù)就是以這種方式完成與應(yīng)用程序通信的。
以上就是小編為大家?guī)?lái)的淺談Android Activity與Service的交互方式的全部?jī)?nèi)容了,希望對(duì)大家有所幫助,多多支持腳本之家~
- Android檢測(cè)Activity或者Service是否運(yùn)行的方法
- Android中Service和Activity相互通信示例代碼
- Android中Service與Activity之間通信的幾種方式
- Android Activity與Service通信(不同進(jìn)程之間)詳解
- Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解
- Android使用Messenger實(shí)現(xiàn)service與activity交互
- Android實(shí)現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法詳解
- Android實(shí)現(xiàn)從activity中停止Service的方法
- Android中Service實(shí)時(shí)向Activity傳遞數(shù)據(jù)實(shí)例分析
- android使用service和activity獲取屏幕尺寸的方法
- 詳解Android Service與Activity之間通信的幾種方式
相關(guān)文章
Android加載大分辨率圖片到手機(jī)內(nèi)存中的實(shí)例方法
有些圖片的分辨率比較高,把它直接加載到手機(jī)內(nèi)存中之后,會(huì)導(dǎo)致堆內(nèi)存溢出的問(wèn)題,下面就講解一下Android的堆內(nèi)存以及如何在Android應(yīng)用中加載一個(gè)高分辨率的圖片的方法2013-11-11Android selector狀態(tài)選擇器的使用詳解
這篇文章主要為大家詳細(xì)介紹了Android selector狀態(tài)選擇器的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Android ExpandableRecyclerView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android ExpandableRecyclerView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Android自定義橫向滑動(dòng)菜單的實(shí)現(xiàn)
這篇文章主要介紹了Android自定義橫向滑動(dòng)菜單的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05解決android.support.v4.content.FileProvide找不到的問(wèn)題
這篇文章主要介紹了解決android.support.v4.content.FileProvide找不到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android開(kāi)發(fā)者必備的十個(gè)工具介紹
這篇文章主要介紹了Android開(kāi)發(fā)者必備的十個(gè)工具介紹,在這篇文章中,討論了10個(gè)最常見(jiàn)的工具,android 開(kāi)發(fā)者應(yīng)該了解和學(xué)習(xí)使用,需要的朋友可以參考下2015-03-03android開(kāi)發(fā)教程之間隔執(zhí)行程序(android計(jì)時(shí)器)
android開(kāi)發(fā)中有些情況需要隔一段時(shí)間去執(zhí)行某個(gè)操作一次或者是每隔一段時(shí)間久執(zhí)行某個(gè)操作,下面是實(shí)現(xiàn)方法2014-02-02Kotlin Lambda表達(dá)式實(shí)踐使用介紹
lambda 本質(zhì)上是可以傳遞給函數(shù)的一小段代碼,Kotlin 與 Java 中的 Lambda 有一定的區(qū)別,除了對(duì) lambda 的全面支持外,還有內(nèi)聯(lián)函數(shù)等簡(jiǎn)潔高效的特性。下面我們來(lái)仔細(xì)看一下2022-12-12