Android編程實(shí)現(xiàn)開(kāi)始及停止service的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)開(kāi)始及停止service的方法。分享給大家供大家參考,具體如下:
開(kāi)始一個(gè)Service
你可以從一個(gè)activity或從其它應(yīng)用的組件通過(guò)傳遞一個(gè)Intent(指定了要啟動(dòng)的服務(wù))給startService()啟動(dòng)一個(gè)服務(wù).Android系統(tǒng)然后調(diào)用service的onStartCommand()方法并且把Intent傳遞給它.(你永遠(yuǎn)不能直接調(diào)用onStartCommand().)
例如,一個(gè)activity可以在調(diào)用startService()時(shí)使用一個(gè)明確的intent開(kāi)始前文的例子中的service(HelloSevice):
Intentintent = new Intent(this, HelloService.class); startService(intent);
startService()方法會(huì)立即返回然后Android系統(tǒng)調(diào)用service的onStartCommand()方法.但是如果service尚沒(méi)有運(yùn)行,系統(tǒng)會(huì)先調(diào)用onCreate(),然后調(diào)用onStartCommand().
如果service沒(méi)有提供綁定功能,傳給startService()的intent是應(yīng)用組件與service之間唯一的通訊方式.然而,如果你希望service回發(fā)一個(gè)結(jié)果,那么啟動(dòng)這個(gè)service的客戶(hù)端可以創(chuàng)建一個(gè)用于廣播(使用getBroadcast())的PendingIntent然后放在intent中傳給service,service然后就可以使用廣播來(lái)回送結(jié)果.
不同的啟動(dòng)請(qǐng)求導(dǎo)致對(duì)service的onStartCommand()的不同調(diào)用,但停止service的請(qǐng)求只有一個(gè)(使用stopSelf()或stopService()).
停止一個(gè)service
一個(gè)"啟動(dòng)的"service必須管理其自己的生命期.這表示,系統(tǒng)不會(huì)停止或銷(xiāo)毀這種service,除非內(nèi)存不夠用了并且service在onStartCommand()返回后會(huì)繼續(xù)運(yùn)行.所以,service必須調(diào)用stopSelf()停止自己或由另一個(gè)組件調(diào)用stopService()來(lái)停止它.
一旦通過(guò)stopSelf()或stopService()發(fā)出了停止請(qǐng)求,系統(tǒng)就會(huì)盡可能快地銷(xiāo)毀service.
然而,如果你的service同時(shí)處理多個(gè)對(duì)onStartCommand()的請(qǐng)求,那么你不應(yīng)在處理完一個(gè)請(qǐng)求之后就停止service,因?yàn)槟憧赡芤呀?jīng)又收到了新的啟動(dòng)請(qǐng)求(在第個(gè)完成后停止將會(huì)結(jié)束掉第二個(gè)).要避免這個(gè)問(wèn)題,你可以使用stopSelf(int)來(lái)保證你的停止請(qǐng)求對(duì)應(yīng)于你最近的開(kāi)始請(qǐng)求.也就是,當(dāng)你調(diào)用stopSelf(int)時(shí),你傳遞開(kāi)始請(qǐng)求的ID(傳遞給onStartCommand()的startId)給service,如果service在你調(diào)用stopSelf(int)之前收到一了個(gè)新的開(kāi)始請(qǐng)求,發(fā)現(xiàn)ID不同,于是service將不會(huì)停止.
注意:你的應(yīng)用在完成工作后停止它所有的service是非常重要的.這可以避免浪費(fèi)系統(tǒng)資源和消耗電量.如果需要,其它的組件可以調(diào)用stopService()停止service.即使你為service啟用了綁定,你也必須自己停止service,甚至它收到了對(duì)onStartCommand()的調(diào)用也這樣.
創(chuàng)建一個(gè)綁定的Service
一個(gè)綁定的service是允許應(yīng)用的組件通過(guò)調(diào)用bindService()來(lái)綁定它以創(chuàng)建一個(gè)能長(zhǎng)期存在的連接(并且一般不允許組件調(diào)用startService()來(lái)啟動(dòng)它).
當(dāng)你的activity或其它組件想與service交互或你的應(yīng)用想基于IPC的向其它應(yīng)用提供功能時(shí),你應(yīng)該創(chuàng)建一個(gè)綁定的service.
要?jiǎng)?chuàng)建一個(gè)綁定的service,你必須實(shí)現(xiàn)回調(diào)方法onBind(),還要在其中返回一個(gè)IBinder,這個(gè)IBinder定義了與service通訊的接口.其它應(yīng)用組件就可以在之后調(diào)用bindService()來(lái)接收這個(gè)接口并開(kāi)始調(diào)用service的方法.service只在有應(yīng)用組件綁定到它時(shí)才活著,所以當(dāng)沒(méi)有組件綁定到它時(shí),系統(tǒng)就會(huì)宰了它(你不需去停止一個(gè)綁定的service,跟用onStartCommand()啟動(dòng)的service不一樣).
要?jiǎng)?chuàng)建一個(gè)綁定的service,首先要做的就是定義客戶(hù)端如何與service通訊的接口.這個(gè)接口必須是IBinder的一個(gè)實(shí)現(xiàn),并且必須被回調(diào)方法onBind()返回.一旦客戶(hù)端接收到IBinder,它就可以開(kāi)始與service進(jìn)行交互.
多個(gè)客戶(hù)端可以一起綁定到一個(gè)service.當(dāng)一個(gè)客戶(hù)端完成與service的交互,它調(diào)用unbindService()來(lái)解除綁定.一旦不再有任何客戶(hù)端綁定到service,系統(tǒng)就宰了這個(gè)service.
有很多方法來(lái)實(shí)現(xiàn)一個(gè)綁定的service并且這些實(shí)現(xiàn)要比"開(kāi)始的"service難懂得多.
發(fā)送通知給用戶(hù)
一旦開(kāi)始運(yùn)行,一個(gè)service可以通過(guò)Toast通知或狀態(tài)欄通來(lái)通知用戶(hù)一些事件.
一個(gè)toast通知是一個(gè)出現(xiàn)在當(dāng)前窗口表面上并過(guò)一會(huì)就消失的消息.當(dāng)一個(gè)狀態(tài)欄通知提供一個(gè)帶有消息的圖標(biāo)到狀態(tài)欄,用就可以先定它來(lái)執(zhí)行一些動(dòng)作(比如啟動(dòng)一個(gè)activity).
通常,一個(gè)狀態(tài)欄通知是當(dāng)一些后臺(tái)工作(比如一個(gè)文件下載完成了)完成后通知用戶(hù)可以對(duì)它進(jìn)行動(dòng)作的最佳方式.當(dāng)用戶(hù)選擇這個(gè)通知時(shí),它可以開(kāi)始一個(gè)activity(比如可以查看下載的文件).
更多關(guān)于Android組件相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android基本組件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- 詳解Android中Service服務(wù)的基礎(chǔ)知識(shí)及編寫(xiě)方法
- Android實(shí)現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法詳解
- Android Service自啟動(dòng)注意事項(xiàng)分析
- Android中使用Service實(shí)現(xiàn)后臺(tái)發(fā)送郵件功能實(shí)例
- Android實(shí)現(xiàn)從activity中停止Service的方法
- Android中Service服務(wù)詳解(二)
- Android中Service服務(wù)詳解(一)
- 詳解Android中IntentService的使用方法
- Android中使用IntentService創(chuàng)建后臺(tái)服務(wù)實(shí)例
- android IntentService實(shí)現(xiàn)原理及內(nèi)部代碼分享
- 深入剖析Android系統(tǒng)中Service和IntentService的區(qū)別
相關(guān)文章
Android設(shè)計(jì)模式之適配器(Adapter)模式
這篇文章主要介紹了Android設(shè)計(jì)模式之適配器(Adapter)模式,以源碼解析的方式分析適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android隨機(jī)給出加減乘除的四則運(yùn)算算術(shù)題
這篇文章主要為大家詳細(xì)介紹了Android隨機(jī)給出加減乘除的四則運(yùn)算算術(shù)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android 驗(yàn)證碼功能實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 驗(yàn)證碼功能實(shí)現(xiàn)代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
詳解Android使用CoordinatorLayout+AppBarLayout實(shí)現(xiàn)拉伸頂部圖片功能
這篇文章主要介紹了Android使用CoordinatorLayout+AppBarLayout實(shí)現(xiàn)拉伸頂部圖片功能,本文實(shí)例文字相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Android文字匹配度算法及實(shí)際應(yīng)用示例
本文介紹了Android應(yīng)用中常用的文字匹配度算法Levenshtein Distance,并給出了實(shí)際應(yīng)用示例,通過(guò)合理選擇和應(yīng)用文字匹配度算法,可以實(shí)現(xiàn)多種功能,提升用戶(hù)體驗(yàn),增強(qiáng)應(yīng)用的實(shí)用性,需要的朋友可以參考下2024-05-05
Android4.4下MediaProvider無(wú)法向外置SD卡中文件寫(xiě)數(shù)據(jù)的解決方法
這篇文章主要介紹了Android4.4下MediaProvider無(wú)法向外置SD卡中文件寫(xiě)數(shù)據(jù)的解決方法,實(shí)例分析了Android4.4下針對(duì)讀寫(xiě)限制的修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
微信小程序—微信跳一跳,Android游戲助手(外掛)使用教程詳解
這篇文章主要介紹了微信小程序—微信跳一跳,Android游戲助手(外掛)使用教程詳解,需要的朋友可以參考下2018-01-01
Android Studio實(shí)現(xiàn)簡(jiǎn)單的通訊錄
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單的通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04

