Android Service詳解

????????Service 對于廣大的Android開發(fā)者來說算是耳熟能詳了践瓷,作為Android的四大組件之一牺陶,在我們的開發(fā)中也起著重要的作用途戒,作為Android開發(fā),或多或少都知道一些呜呐,但是不是每個人把所有知識點都了解的透測。本篇文章對Service的用法做一個總結悍募,從Service的簡介蘑辑,Service的啟動方式,Service的生命周期和IntentService四個方面來細說Service坠宴,并在文后羅列一些常見的面試題作為思考和回顧洋魂。

一、Service簡介

引用官方定義:

? ? Service 是一個可以在后臺執(zhí)行長時間運行操作而不提供用戶界面的應用組件喜鼓。服務可由其他應用組件啟動副砍,而且即使用戶切換到其他應用,服務仍將在后臺繼續(xù)運行庄岖。 此外豁翎,組件可以綁定到服務,以與之進行交互隅忿,甚至是執(zhí)行進程間通信 (IPC)心剥。 例如,服務可以處理網(wǎng)絡事務背桐、播放音樂刘陶,執(zhí)行文件 I/O 或與內(nèi)容提供程序交互,而所有這一切均可在后臺進行牢撼。

? ? Service是一個可以在后臺執(zhí)行長時間操作而不使用用戶界面的應用組件匙隔。那么問題來了,既然它不使用用戶界面熏版,那么它怎么知道應該什么時候開始執(zhí)行什么操作呢纷责?答案是——它可以與其他的引用組件形成一些聯(lián)系,從而可以根據(jù)其傳來的信息在合適的時候執(zhí)行合適的操作撼短。

二再膳、Service的啟動方式

? ? Service的啟動方式主要有兩種,分別是startService和bindService曲横。其中喂柒,startService使用的是同一個Service不瓶,因此onStart()會執(zhí)行多次,onCreate()只執(zhí)行一次灾杰,onStartCommand()也會執(zhí)行多次蚊丐。使用bindService啟動時,onCreate()與onBind()都只會調(diào)用一次艳吠。

使用startService啟動時是單獨開一個服務麦备,與Activity沒有任何關系,而bindService方式啟動時昭娩,Service會和Activity進行綁定凛篙,當對應的activity銷毀時,對應的Service也會銷毀栏渺。

三呛梆、Service的生命周期

下圖是startService和bindService兩種方式啟動Service的示意圖:

Service的兩種啟動方式

1、startService

onCreate():如果service沒被創(chuàng)建過磕诊,調(diào)用startService()后會執(zhí)行onCreate()回調(diào)削彬;如果service已處于運行中,調(diào)用startService()不會執(zhí)行onCreate()方法秀仲。

onStartCommand():多次執(zhí)行了Context的startService()方法融痛,那么Service的

onStartCommand()方法也會相應的多次調(diào)用。

onBind():Service中的onBind()方法是抽象方法神僵,Service類本身就是抽象類雁刷,所以onBind()方法是必須重寫的,即使我們用不到保礼。

onDestory():在銷毀Service的時候該方法沛励。

2、bindService

啟動的服務和調(diào)用者之間是典型的Client-Server模式炮障。調(diào)用者是client目派,Service則是Server端。Service只有一個胁赢,但綁定到Service上面的Client可以有一個或很多個企蹭。bindService啟動服務的生命周期與其綁定的client息息相關。

1)首先智末,在Service的onBind()方法中返回IBinder類型的實例谅摄。

2)onBInd()方法返回的IBinder的實例需要能夠返回Service實例本身

3、.Service 的 onStartCommand 方法返回值所代表的含義

1)START_NOT_STICKY

在執(zhí)行完 onStartCommand 后,服務被異常 kill 掉,系統(tǒng)不會自動重啟該服務系馆。

2)START_STICKY

重傳 Intent送漠。使用這個返回值時,如果在執(zhí)行完 onStartCommand 后,服務被異 常 kill 掉,系統(tǒng)會自動重啟該服務 ,并且onStartCommand方法會執(zhí)行,onStartCommand方法中的intent值為null由蘑。適用于媒體播放器或類似服務闽寡。

3)START_REDELIVER_INTEN

使用這個返回值時,服務被異 常 kill 掉,系統(tǒng)會自動重啟該服務,并將 Intent 的值傳入代兵。適用于主動執(zhí)行應該立即恢復的作業(yè)(例如下載文件)的服務。

四爷狈、IntentService

1植影、IntentService 是 Service 的子類,默認開啟了一個工作線程HandlerThread淆院,使用這個工作線程逐一處理所有啟動請求何乎,在任務執(zhí)行完畢后會自動停止服務句惯。只要實現(xiàn)一個方法 onHandleIntent土辩,該方法會接收每個啟動請求的 Intent,能夠執(zhí)行后臺工作和耗時操作抢野】教裕可以啟動IntentService 多次,而每一個耗時操作會以隊列的方式在 IntentService 的 onHandlerIntent回調(diào)方法中執(zhí)行指孤,并且启涯,每一次只會執(zhí)行一個工作線程,執(zhí)行完第一個再執(zhí)行第二個恃轩。并且等待所有消息都執(zhí)行完后才終止服務结洼。

2、IntentService原理

1)創(chuàng)建一個名叫 ServiceHandler 的內(nèi)部 Handler

2)把內(nèi)部Handler與HandlerThread所對應的子線程進行綁定

3)HandlerThread開啟線程 創(chuàng)建自己的looper

4)通過 onStartCommand() intent叉跛,依次插入到工作隊列中松忍,并發(fā)送給 onHandleIntent()逐個處理可以用作后臺下載任務 靜默上傳

3、與Service的區(qū)別

IntentService會創(chuàng)建獨立的worker線程來處理所有的Intent請求 Service主線程不能處理耗時操作,IntentService不會阻塞UI線程筷厘,而普通Serveice會導致ANR異常鸣峭。為Service的onBind()提供默認實現(xiàn),返回null酥艳;onStartCommand提供默認實現(xiàn)摊溶,將請求Intent添加到隊列中。所有請求處理完成后充石,IntentService會自動停止莫换,無需調(diào)用stopSelf()方法停止Service。

五骤铃、常見面試題

1浓镜、 Service的兩種啟動方式有何區(qū)別?

2劲厌、如何保證Service不被殺死膛薛?

3、Service 和 IntentService 的區(qū)別补鼻?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哄啄,一起剝皮案震驚了整個濱河市雅任,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咨跌,老刑警劉巖沪么,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锌半,居然都是意外死亡禽车,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門刊殉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殉摔,“玉大人,你說我怎么就攤上這事记焊∫菰拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵遍膜,是天一觀的道長碗硬。 經(jīng)常有香客問我,道長瓢颅,這世上最難降的妖魔是什么恩尾? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮挽懦,結果婚禮上翰意,老公的妹妹穿的比我還像新娘。我一直安慰自己巾兆,他們只是感情好猎物,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著角塑,像睡著了一般蔫磨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圃伶,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天堤如,我揣著相機與錄音,去河邊找鬼窒朋。 笑死搀罢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的侥猩。 我是一名探鬼主播榔至,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼欺劳!你這毒婦竟也來了唧取?” 一聲冷哼從身側響起铅鲤,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枫弟,沒想到半個月后邢享,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡淡诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年骇塘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韩容。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡款违,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宙攻,到底是詐尸還是另有隱情奠货,我是刑警寧澤介褥,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布座掘,位于F島的核電站,受9級特大地震影響柔滔,放射性物質(zhì)發(fā)生泄漏溢陪。R本人自食惡果不足惜睛廊,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一形真、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧超全,春花似錦咆霜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疏遏,卻和暖如春脉课,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背财异。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工倘零, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戳寸。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓呈驶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疫鹊。 傳聞我的和親對象是個殘疾皇子袖瞻,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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

  • 個人學習筆記跌穗,未經(jīng)允許,不得轉載虏辫,謝謝~ 本文目錄 一蚌吸、簡介[http://www.reibang.com/p/...
    王十一豆加閱讀 3,156評論 1 19
  • 本文前面先看看針對這個知識點會有哪些會在面試中出現(xiàn),先對題目了解一下砌庄。后面會針對Service沒有被問到的內(nèi)容再次...
    帥次閱讀 13,054評論 0 9
  • 這篇文章主要是講解Service 前言:Service非常適用于去執(zhí)行那些不需要和用戶交互而且還要長期運行在后臺的...
    李慶雪閱讀 5,830評論 2 7
  • Android Service 詳解(上) Service 作為 Android 的四大組件還是很有必要好好掌握一...
    sydMobile閱讀 12,803評論 0 7
  • 生命周期如下: 兩種啟動方式 第一種方式: startService() 通過startService啟動后羹唠,se...
    錢曉缺閱讀 458評論 0 0