Service簡(jiǎn)(不詳)解

Service,四大組件之一,用很多熙卡,但是對(duì)其理解還不是很全面≌人ⅲ現(xiàn)在我們聊聊關(guān)于Service這個(gè)組件。雖然不是很詳細(xì)驳癌,但是知識(shí)點(diǎn)比較全面滑燃。

Service是什么

網(wǎng)上都說(shuō),Service是是處理一些耗時(shí)的邏輯颓鲜,或者執(zhí)行長(zhǎng)期運(yùn)行的任務(wù)表窘。不錯(cuò),但是如果直接在onCreate()或者onStart()直接執(zhí)行耗時(shí)操作甜滨,那有你好受的了乐严。為什么?下面再說(shuō)衣摩。

Service啟動(dòng)方式

1.startService
不能Activity直接通信昂验,可用Broadcast機(jī)制通知Activity更新,不會(huì)隨著Activity的finish而stop艾扮,需要我們手動(dòng)去stop既琴,或者內(nèi)存不足,系統(tǒng)去stop
2.bindService
可以直接和Activity通信泡嘴,會(huì)隨著應(yīng)用的關(guān)閉而stop

Service的生命周期

onCreate  onStart  onDestroy  onBind
1). 被啟動(dòng)的服務(wù)的生命周期
如果一個(gè)Service被某個(gè)Activity 調(diào)用 Context.startService 方法啟動(dòng)呛梆,那么不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都在后臺(tái)運(yùn)行磕诊。如果一個(gè)Service被startService 方法多次啟動(dòng),那么onCreate方法只會(huì)調(diào)用一次纹腌,onStart將會(huì)被調(diào)用多次(對(duì)應(yīng)調(diào)用startService的次數(shù))霎终,并且系統(tǒng)只會(huì)創(chuàng)建Service的一個(gè)實(shí)例(因此你應(yīng)該知道只需要一次stopService調(diào)用)。該Service將會(huì)一直在后臺(tái)運(yùn)行升薯,而不管對(duì)應(yīng)程序的Activity是否在運(yùn)行莱褒,直到被調(diào)用stopService,或自身的stopSelf方法涎劈。當(dāng)然如果系統(tǒng)資源不足广凸,android系統(tǒng)也可能結(jié)束服務(wù)。
2). 被綁定的服務(wù)的生命周期
如果一個(gè)Service被某個(gè)Activity 調(diào)用 Context.bindService 方法綁定啟動(dòng)蛛枚,不管調(diào)用 bindService 調(diào)用幾次谅海,onCreate方法都只會(huì)調(diào)用一次,同時(shí)onStart方法始終不會(huì)被調(diào)用蹦浦。當(dāng)連接建立之后扭吁,Service將會(huì)一直運(yùn)行,除非調(diào)用Context.unbindService 斷開(kāi)連接或者之前調(diào)用bindService 的 Context 不存在了(如Activity被finish的時(shí)候),系統(tǒng)將會(huì)自動(dòng)停止Service侥袜,對(duì)應(yīng)onDestroy將被調(diào)用蝌诡。
3). 被啟動(dòng)又被綁定的服務(wù)的生命周期
如果一個(gè)Service又被啟動(dòng)又被綁定,則該Service將會(huì)一直在后臺(tái)運(yùn)行枫吧。并且不管如何調(diào)用浦旱,onCreate始終只會(huì)調(diào)用一次,對(duì)應(yīng)startService調(diào)用多少次九杂,Service的onStart便會(huì)調(diào)用多少次颁湖。調(diào)用unbindService將不會(huì)停止Service,而必須調(diào)用 stopService 或 Service的 stopSelf 來(lái)停止服務(wù)尼酿。

Service與Thread

很多時(shí)候爷狈,你可能會(huì)問(wèn),為什么要用 Service裳擎,而不用 Thread 呢涎永,因?yàn)橛?Thread 是很方便的,比起 Service 也方便多了鹿响,下面我詳細(xì)的來(lái)解釋一下羡微。
1). Thread
Thread 是程序執(zhí)行的最小單元,它是分配CPU的基本單位惶我÷杈螅可以用 Thread 來(lái)執(zhí)行一些異步的操作。
2). 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)行的捧挺。如果是RemoteService,那么對(duì)應(yīng)的 Service 則是運(yùn)行在獨(dú)立進(jìn)程的 main 線程上尿瞭。因此請(qǐng)不要把 Service 理解成線程闽烙,它跟線程半毛錢的關(guān)系都沒(méi)有!
所以我們不能把耗時(shí)的操作放在Service的onCreate()或者onStart()上了声搁,很容易報(bào)ANR黑竞。
既然這樣,那么我們?yōu)槭裁匆?Service 呢疏旨?其實(shí)這跟 android 的系統(tǒng)機(jī)制有關(guān)很魂,我們先拿 Thread 來(lái)說(shuō)。Thread 的運(yùn)行是獨(dú)立于 Activity 的檐涝,也就是說(shuō)當(dāng)一個(gè) Activity 被 finish 之后莫换,如果你沒(méi)有主動(dòng)停止 Thread 或者 Thread 里的 run 方法沒(méi)有執(zhí)行完畢的話霞玄,Thread 也會(huì)一直執(zhí)行。因此這里會(huì)出現(xiàn)一個(gè)問(wèn)題:當(dāng) Activity 被 finish 之后拉岁,你不再持有該 Thread 的引用坷剧。另一方面,你沒(méi)有辦法在不同的 Activity 中對(duì)同一 Thread 進(jìn)行控制喊暖。
舉個(gè)例子:如果你的 Thread 需要不停地隔一段時(shí)間就要連接服務(wù)器做某種同步的話惫企,該 Thread 需要在 Activity 沒(méi)有start的時(shí)候也在運(yùn)行。這個(gè)時(shí)候當(dāng)你 start 一個(gè) Activity 就沒(méi)有辦法在該 Activity 里面控制之前創(chuàng)建的 Thread陵叽。因此你便需要?jiǎng)?chuàng)建并啟動(dòng)一個(gè) Service 狞尔,在 Service 里面創(chuàng)建、運(yùn)行并控制該 Thread巩掺,這樣便解決了該問(wèn)題(因?yàn)槿魏?Activity 都可以控制同一 Service偏序,而系統(tǒng)也只會(huì)創(chuàng)建一個(gè)對(duì)應(yīng) Service 的實(shí)例)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胖替,一起剝皮案震驚了整個(gè)濱河市研儒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌独令,老刑警劉巖端朵,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燃箭,居然都是意外死亡冲呢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門招狸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敬拓,“玉大人,你說(shuō)我怎么就攤上這事裙戏〕送梗” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵挽懦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我木人,道長(zhǎng)信柿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任醒第,我火速辦了婚禮渔嚷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稠曼。我一直安慰自己形病,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著漠吻,像睡著了一般量瓜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上途乃,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天绍傲,我揣著相機(jī)與錄音,去河邊找鬼耍共。 笑死烫饼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的试读。 我是一名探鬼主播杠纵,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钩骇!你這毒婦竟也來(lái)了比藻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伊履,失蹤者是張志新(化名)和其女友劉穎韩容,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體唐瀑,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡群凶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哄辣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片请梢。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖力穗,靈堂內(nèi)的尸體忽然破棺而出毅弧,到底是詐尸還是另有隱情,我是刑警寧澤当窗,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布够坐,位于F島的核電站,受9級(jí)特大地震影響崖面,放射性物質(zhì)發(fā)生泄漏元咙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一巫员、第九天 我趴在偏房一處隱蔽的房頂上張望庶香。 院中可真熱鬧,春花似錦简识、人聲如沸赶掖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奢赂。三九已至陪白,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呈驶,已是汗流浹背拷泽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袖瞻,地道東北人司致。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像聋迎,于是被迫代替她去往敵國(guó)和親脂矫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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