Android基礎(chǔ)--service

Service相關(guān)
1.兩種service啟動(dòng)方式
1)startService
通過(guò)startService啟動(dòng)后好渠,service會(huì)一直無(wú)限期運(yùn)行下去文虏,只有外部調(diào)用了stopService()或stopSelf()方法時(shí),該Service才會(huì)停止運(yùn)行并銷毀坷备。
要?jiǎng)?chuàng)建一個(gè)這樣的Service熄浓,你需要讓該類繼承Service類,然后重寫以下方法:
onCreate()
a.如果service沒(méi)被創(chuàng)建過(guò)省撑,調(diào)用startService()后會(huì)執(zhí)行onCreate()回調(diào)赌蔑;
b.如果service已處于運(yùn)行中,調(diào)用startService()不會(huì)執(zhí)行onCreate()方法竟秫。
也就是說(shuō)娃惯,onCreate()只會(huì)在第一次創(chuàng)建service時(shí)候調(diào)用,多次執(zhí)行startService()不會(huì)重復(fù)調(diào)用onCreate()肥败,此方法適合完成一些初始化工作趾浅。
onStartCommand()
如果多次執(zhí)行了Context的startService()方法,那么Service的onStartCommand()方法也會(huì)相應(yīng)的多次調(diào)用拙吉。onStartCommand()方法很重要潮孽,我們?cè)谠摲椒ㄖ懈鶕?jù)傳入的Intent參數(shù)進(jìn)行實(shí)際的操作,比如會(huì)在此處創(chuàng)建一個(gè)線程用于下載數(shù)據(jù)或播放音樂(lè)等筷黔。
onBind()
Service中的onBind()方法是抽象方法往史,Service類本身就是抽象類,所以onBind()方法是必須重寫的佛舱,即使我們用不到椎例。
onDestory()
在銷毀的時(shí)候會(huì)執(zhí)行Service該方法挨决。
這幾個(gè)方法都是回調(diào)方法,且在主線程中執(zhí)行订歪,由android操作系統(tǒng)在合適的時(shí)機(jī)調(diào)用脖祈。
2)bindService
bindService啟動(dòng)服務(wù)特點(diǎn):
a.bindService啟動(dòng)的服務(wù)和調(diào)用者之間是典型的client-server模式。調(diào)用者是client刷晋,service則是server端盖高。service只有一個(gè),但綁定到service上面的client可以有一個(gè)或很多個(gè)眼虱。這里所提到的client指的是組件喻奥,比如某個(gè)Activity。
b.client可以通過(guò)IBinder接口獲取Service實(shí)例捏悬,從而實(shí)現(xiàn)在client端直接調(diào)用Service中的方法以實(shí)現(xiàn)靈活交互撞蚕,這在通過(guò)startService方法啟動(dòng)中是無(wú)法實(shí)現(xiàn)的。
c.bindService啟動(dòng)服務(wù)的生命周期與其綁定的client息息相關(guān)过牙。當(dāng)client銷毀時(shí)甥厦,client會(huì)自動(dòng)與Service解除綁定。當(dāng)然寇钉,client也可以明確調(diào)用Context的unbindService()方法與Service解除綁定刀疙。當(dāng)沒(méi)有任何client與Service綁定時(shí),Service會(huì)自行銷毀扫倡。
2.service和thread
Thread庙洼,是用于開(kāi)啟一個(gè)子線程,在這里去執(zhí)行一些耗時(shí)操作就不會(huì)阻塞主線程的運(yùn)行镊辕。而Service我們最初理解的時(shí)候油够,總會(huì)覺(jué)得它是用來(lái)處理一些后臺(tái)任務(wù)的,一些比較耗時(shí)的操作也可以放在這里運(yùn)行征懈,這就會(huì)讓人產(chǎn)生混淆了石咬。
Thread:Thread 是程序執(zhí)行的最小單元,它是分配CPU的基本單位卖哎」碛疲可以用 Thread 來(lái)執(zhí)行一些異步的操作。
Service:Service 是android的一種機(jī)制亏娜,當(dāng)它運(yùn)行的時(shí)候如果是Local Service焕窝,那么對(duì)應(yīng)的 Service 是運(yùn)行在主進(jìn)程的 main 線程上的。如:onCreate维贺,onStart 這些函數(shù)在被系統(tǒng)調(diào)用的時(shí)候都是在主進(jìn)程的 main 線程上運(yùn)行的它掂。如果是Remote Service,那么對(duì)應(yīng)的 Service 則是運(yùn)行在獨(dú)立進(jìn)程的 main 線程上。因此請(qǐng)不要把 Service 理解成線程虐秋,它跟線程半毛錢的關(guān)系都沒(méi)有榕茧!
因此你可以把 Service 想象成一種消息服務(wù),而你可以在任何有 Context 的地方調(diào)用 Context.startService客给、Context.stopService用押、Context.bindService,Context.unbindService靶剑,來(lái)控制它蜻拨,你也可以在 Service 里注冊(cè) BroadcastReceiver,在其他地方通過(guò)發(fā)送 broadcast 來(lái)控制它桩引,當(dāng)然這些都是 Thread 做不到的官觅。
3.service的生命周期回調(diào)
1)onCreate: 執(zhí)行startService方法時(shí),如果Service沒(méi)有運(yùn)行的時(shí)候會(huì)創(chuàng)建該Service并執(zhí)行Service的onCreate回調(diào)方法阐污;如果Service已經(jīng)處于運(yùn)行中,那么執(zhí)行startService方法不會(huì)執(zhí)行Service的onCreate方法咱圆。也就是說(shuō)如果多次執(zhí)行了Context的startService方法啟動(dòng)Service笛辟,Service方法的onCreate方法只會(huì)在第一次創(chuàng)建Service的時(shí)候調(diào)用一次,以后均不會(huì)再次調(diào)用序苏。我們可以在onCreate方法中完成一些Service初始化相關(guān)的操作手幢。
2)onStartCommand: 在執(zhí)行了startService方法之后,有可能會(huì)調(diào)用Service的onCreate方法忱详,在這之后一定會(huì)執(zhí)行Service的onStartCommand回調(diào)方法围来。也就是說(shuō),如果多次執(zhí)行了Context的startService方法匈睁,那么Service的onStartCommand方法也會(huì)相應(yīng)的多次調(diào)用监透。onStartCommand方法很重要,我們?cè)谠摲椒ㄖ懈鶕?jù)傳入的Intent參數(shù)進(jìn)行實(shí)際的操作航唆,比如會(huì)在此處創(chuàng)建一個(gè)線程用于下載數(shù)據(jù)或播放音樂(lè)等胀蛮。
3)onBind: Service中的onBind方法是抽象方法,所以Service類本身就是抽象類糯钙,也就是onBind方法是必須重寫的粪狼,即使我們用不到。在通過(guò)startService使用Service時(shí)任岸,我們?cè)谥貙憃nBind方法時(shí)再榄,只需要將其返回null即可。onBind方法主要是用于給bindService方法調(diào)用Service時(shí)才會(huì)使用到享潜。
4)onDestroy: 通過(guò)startService方法啟動(dòng)的Service會(huì)無(wú)限期運(yùn)行困鸥,只有當(dāng)調(diào)用了Context的stopService或在Service內(nèi)部調(diào)用stopSelf方法時(shí),Service才會(huì)停止運(yùn)行并銷毀剑按,在銷毀的時(shí)候會(huì)執(zhí)行Service回調(diào)函數(shù)窝革。
5)onStartCommand的返回值:
當(dāng)Android面臨內(nèi)存匱乏的時(shí)候购城,可能會(huì)銷毀掉你當(dāng)前運(yùn)行的Service,然后待內(nèi)存充足的時(shí)候可以重新創(chuàng)建Service虐译,Service被Android系統(tǒng)強(qiáng)制銷毀并再次重建的行為依賴于Service中onStartCommand方法的返回值瘪板。我們常用的返回值有三種值,START_NOT_STICKY漆诽、START_STICKY和START_REDELIVER_INTENT侮攀,這三個(gè)值都是Service中的靜態(tài)常量。
a.START_NOT_STICKY: 如果返回START_NOT_STICKY厢拭,表示當(dāng)Service運(yùn)行的進(jìn)程被Android系統(tǒng)強(qiáng)制殺掉之后兰英,不會(huì)重新創(chuàng)建該Service,當(dāng)然如果在其被殺掉之后一段時(shí)間又調(diào)用了startService供鸠,那么該Service又將被實(shí)例化畦贸。那什么情境下返回該值比較恰當(dāng)呢?如果我們某個(gè)Service執(zhí)行的工作被中斷幾次無(wú)關(guān)緊要或者對(duì)Android內(nèi)存緊張的情況下需要被殺掉且不會(huì)立即重新創(chuàng)建這種行為也可接受楞捂,那么我們便可將 onStartCommand的返回值設(shè)置為START_NOT_STICKY薄坏。舉個(gè)例子,某個(gè)Service需要定時(shí)從服務(wù)器獲取最新數(shù)據(jù):通過(guò)一個(gè)定時(shí)器每隔指定的N分鐘讓定時(shí)器啟動(dòng)Service去獲取服務(wù)端的最新數(shù)據(jù)寨闹。當(dāng)執(zhí)行到Service的onStartCommand時(shí)胶坠,在該方法內(nèi)再規(guī)劃一個(gè)N分鐘后的定時(shí)器用于再次啟動(dòng)該Service并開(kāi)辟一個(gè)新的線程去執(zhí)行網(wǎng)絡(luò)操作。假設(shè)Service在從服務(wù)器獲取最新數(shù)據(jù)的過(guò)程中被Android系統(tǒng)強(qiáng)制殺掉繁堡,Service不會(huì)再重新創(chuàng)建沈善,這也沒(méi)關(guān)系,因?yàn)樵龠^(guò)N分鐘定時(shí)器就會(huì)再次啟動(dòng)該Service并重新獲取數(shù)據(jù)椭蹄。
b.START_STICKY: 如果返回START_STICKY闻牡,表示Service運(yùn)行的進(jìn)程被Android系統(tǒng)強(qiáng)制殺掉之后,Android系統(tǒng)會(huì)將該Service依然設(shè)置為started狀態(tài)(即運(yùn)行狀態(tài))绳矩,但是不再保存onStartCommand方法傳入的intent對(duì)象澈侠,然后Android系統(tǒng)會(huì)嘗試再次重新創(chuàng)建該Service,并執(zhí)行onStartCommand回調(diào)方法埋酬,但是onStartCommand回調(diào)方法的Intent參數(shù)為null哨啃,也就是onStartCommand方法雖然會(huì)執(zhí)行但是獲取不到intent信息。如果你的Service可以在任意時(shí)刻運(yùn)行或結(jié)束都沒(méi)什么問(wèn)題写妥,而且不需要intent信息拳球,那么就可以在onStartCommand方法中返回START_STICKY,比如一個(gè)用來(lái)播放背景音樂(lè)功能的Service就適合返回該值珍特。
c.START_REDELIVER_INTENT: 如果返回START_REDELIVER_INTENT祝峻,表示Service運(yùn)行的進(jìn)程被Android系統(tǒng)強(qiáng)制殺掉之后,與返回START_STICKY的情況類似,Android系統(tǒng)會(huì)將再次重新創(chuàng)建該Service莱找,并執(zhí)行onStartCommand回調(diào)方法酬姆,但是不同的是,Android系統(tǒng)會(huì)再次將Service在被殺掉之前最后一次傳入onStartCommand方法中的Intent再次保留下來(lái)并再次傳入到重新創(chuàng)建后的Service的onStartCommand方法中奥溺,這樣我們就能讀取到intent參數(shù)辞色。只要返回START_REDELIVER_INTENT,那么onStartCommand重的intent一定不是null浮定。如果我們的Service需要依賴具體的Intent才能運(yùn)行(需要從Intent中讀取相關(guān)數(shù)據(jù)信息等)相满,并且在強(qiáng)制銷毀后有必要重新創(chuàng)建運(yùn)行,那么這樣的Service就適合返回START_REDELIVER_INTENT桦卒。
作者: DocMike
鏈接:https://www.imooc.com/article/19097
來(lái)源:慕課網(wǎng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末立美,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子方灾,更是在濱河造成了極大的恐慌建蹄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裕偿,死亡現(xiàn)場(chǎng)離奇詭異洞慎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)击费,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桦他,“玉大人蔫巩,你說(shuō)我怎么就攤上這事】煅梗” “怎么了圆仔?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蔫劣。 經(jīng)常有香客問(wèn)我坪郭,道長(zhǎng),這世上最難降的妖魔是什么脉幢? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任歪沃,我火速辦了婚禮,結(jié)果婚禮上嫌松,老公的妹妹穿的比我還像新娘沪曙。我一直安慰自己,他們只是感情好萎羔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布液走。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缘眶。 梳的紋絲不亂的頭發(fā)上嘱根,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音巷懈,去河邊找鬼该抒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砸喻,可吹牛的內(nèi)容都是我干的柔逼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼割岛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愉适!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起癣漆,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤维咸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惠爽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癌蓖,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年婚肆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了租副。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡较性,死狀恐怖用僧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赞咙,我是刑警寧澤责循,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站攀操,受9級(jí)特大地震影響院仿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜速和,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一歹垫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颠放,春花似錦县钥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)省有。三九已至,卻和暖如春谴麦,著一層夾襖步出監(jiān)牢的瞬間蠢沿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工匾效, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舷蟀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓面哼,卻偏偏與公主長(zhǎng)得像野宜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魔策,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android中的服務(wù)和windows中的服務(wù)是類似的東西匈子,服務(wù)一般沒(méi)有用戶操作界面,它運(yùn)行于系統(tǒng)中不容易被用戶發(fā)...
    mm_cuckoo閱讀 2,498評(píng)論 1 3
  • 前言:本文所寫的是博主的個(gè)人見(jiàn)解闯袒,如有錯(cuò)誤或者不恰當(dāng)之處虎敦,歡迎私信博主,加以改正政敢!原文鏈接其徙,demo鏈接 Serv...
    PassersHowe閱讀 1,403評(píng)論 0 5
  • 第一種方式:通過(guò)StartService啟動(dòng)Service 通過(guò)startService啟動(dòng)后,service會(huì)一...
    Big不吃魚閱讀 117,299評(píng)論 8 94
  • 上篇我們講解了Android中的5中等級(jí)的進(jìn)程喷户,分別是:前臺(tái)進(jìn)程唾那、可見(jiàn)進(jìn)程、服務(wù)進(jìn)程褪尝、后臺(tái)進(jìn)程闹获、空進(jìn)程。系統(tǒng)會(huì)按照...
    徐愛(ài)卿閱讀 3,843評(píng)論 6 33
  • 北京的天氣好像一夜之間變涼了恼五,早晨下樓遛狗昌罩,習(xí)慣性的只穿了短袖短褲哭懈,遛了不到二百米實(shí)在冷得不行灾馒,胳膊上直起雞皮疙瘩...
    魔女劉閱讀 344評(píng)論 0 1