????????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的示意圖:
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ū)別补鼻?