Service

Android的Service

  1. Service是在main Thread中執(zhí)行,Service中不能執(zhí)行耗時操作(網(wǎng)絡請求,拷貝數(shù)據(jù)庫,大文件)。
  2. 可以在xml中設置Service所在的進程自沧,讓Service在另外的進程中執(zhí)行。
  3. Service執(zhí)行的操作最多是20s树瞭,BroadcastReceiver是10s拇厢,Activity是5s。
  4. Activity通過bindService(Intent晒喷,ServiceConnection旺嬉,flag)與Service綁定。
  5. Activity可以通過startService和bindService啟動Service厨埋。
IntentService

IntentService是一個抽象類邪媳,繼承自Service,內部存在一個ServiceHandler(Handler)和HandlerThread(Thread)荡陷。IntentService是處理異步請求的一個類雨效,在IntentService中有一個工作線程(HandlerThread)來處理耗時操作,啟動IntentService的方式和普通的一樣废赞,不過當執(zhí)行完任務之后徽龟,IntentService會自動停止。另外可以多次啟動IntentService唉地,每一個耗時操作都會以工作隊列的形式在IntentService的onHandleIntent回調中執(zhí)行据悔,并且每次執(zhí)行一個工作線程。IntentService的本質是:封裝了一個HandlerThread和Handler的異步框架耘沼。

生命周期示意圖

Service 作為 Android四大組件之一极颓,應用非常廣泛。和Activity一樣群嗤,Service 也有一系列的生命周期回調函數(shù)菠隆,具體如下圖。


image.png

通常,啟動Service有兩種方式骇径,startService和bindService方式躯肌。

startService生命周期

當我們通過調用了Context的startService方法后,我們便啟動了Service破衔,通過startService方法啟動的Service會一直無限期地運行下去清女,只有在外部調用Context的stopService或Service內部調用Service的stopSelf方法時,該Service才會停止運行并銷毀晰筛。

onCreate

onCreate: 執(zhí)行startService方法時校仑,如果Service沒有運行的時候會創(chuàng)建該Service并執(zhí)行Service的onCreate回調方法;如果Service已經(jīng)處于運行中传惠,那么執(zhí)行startService方法不會執(zhí)行Service的onCreate方法。也就是說如果多次執(zhí)行了Context的startService方法啟動Service稻扬,Service方法的onCreate方法只會在第一次創(chuàng)建Service的時候調用一次卦方,以后均不會再次調用。我們可以在onCreate方法中完成一些Service初始化相關的操作泰佳。

onStartCommand

onStartCommand: 在執(zhí)行了startService方法之后盼砍,有可能會調用Service的onCreate方法,在這之后一定會執(zhí)行Service的onStartCommand回調方法逝她。也就是說浇坐,如果多次執(zhí)行了Context的startService方法,那么Service的onStartCommand方法也會相應的多次調用黔宛。onStartCommand方法很重要近刘,我們在該方法中根據(jù)傳入的Intent參數(shù)進行實際的操作,比如會在此處創(chuàng)建一個線程用于下載數(shù)據(jù)或播放音樂等臀晃。

public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) {
}

當Android面臨內存匱乏的時候觉渴,可能會銷毀掉你當前運行的Service,然后待內存充足的時候可以重新創(chuàng)建Service徽惋,Service被Android系統(tǒng)強制銷毀并再次重建的行為依賴于Service中onStartCommand方法的返回值案淋。我們常用的返回值有三種值,START_NOT_STICKY险绘、START_STICKY和START_REDELIVER_INTENT踢京,這三個值都是Service中的靜態(tài)常量。

START_NOT_STICKY

如果返回START_NOT_STICKY宦棺,表示當Service運行的進程被Android系統(tǒng)強制殺掉之后瓣距,不會重新創(chuàng)建該Service,當然如果在其被殺掉之后一段時間又調用了startService代咸,那么該Service又將被實例化旨涝。那什么情境下返回該值比較恰當呢?如果我們某個Service執(zhí)行的工作被中斷幾次無關緊要或者對Android內存緊張的情況下需要被殺掉且不會立即重新創(chuàng)建這種行為也可接受,那么我們便可將 onStartCommand的返回值設置為START_NOT_STICKY白华。舉個例子慨默,某個Service需要定時從服務器獲取最新數(shù)據(jù):通過一個定時器每隔指定的N分鐘讓定時器啟動Service去獲取服務端的最新數(shù)據(jù)。當執(zhí)行到Service的onStartCommand時弧腥,在該方法內再規(guī)劃一個N分鐘后的定時器用于再次啟動該Service并開辟一個新的線程去執(zhí)行網(wǎng)絡操作厦取。假設Service在從服務器獲取最新數(shù)據(jù)的過程中被Android系統(tǒng)強制殺掉,Service不會再重新創(chuàng)建管搪,這也沒關系虾攻,因為再過N分鐘定時器就會再次啟動該Service并重新獲取數(shù)據(jù)。

START_STICKY

如果返回START_STICKY更鲁,表示Service運行的進程被Android系統(tǒng)強制殺掉之后霎箍,Android系統(tǒng)會將該Service依然設置為started狀態(tài)(即運行狀態(tài)),但是不再保存onStartCommand方法傳入的intent對象澡为,然后Android系統(tǒng)會嘗試再次重新創(chuàng)建該Service漂坏,并執(zhí)行onStartCommand回調方法,但是onStartCommand回調方法的Intent參數(shù)為null媒至,也就是onStartCommand方法雖然會執(zhí)行但是獲取不到intent信息顶别。如果你的Service可以在任意時刻運行或結束都沒什么問題,而且不需要intent信息拒啰,那么就可以在onStartCommand方法中返回START_STICKY驯绎,比如一個用來播放背景音樂功能的Service就適合返回該值。

START_REDELIVER_INTENT

如果返回START_REDELIVER_INTENT谋旦,表示Service運行的進程被Android系統(tǒng)強制殺掉之后剩失,與返回START_STICKY的情況類似,Android系統(tǒng)會將再次重新創(chuàng)建該Service册着,并執(zhí)行onStartCommand回調方法赴叹,但是不同的是,Android系統(tǒng)會再次將Service在被殺掉之前最后一次傳入onStartCommand方法中的Intent再次保留下來并再次傳入到重新創(chuàng)建后的Service的onStartCommand方法中指蚜,這樣我們就能讀取到intent參數(shù)乞巧。只要返回START_REDELIVER_INTENT,那么onStartCommand重的intent一定不是null摊鸡。如果我們的Service需要依賴具體的Intent才能運行(需要從Intent中讀取相關數(shù)據(jù)信息等)绽媒,并且在強制銷毀后有必要重新創(chuàng)建運行,那么這樣的Service就適合返回START_REDELIVER_INTENT免猾。

onBind

Service中的onBind方法是抽象方法是辕,所以Service類本身就是抽象類,也就是onBind方法是必須重寫的猎提,即使我們用不到获三。在通過startService使用Service時,我們在重寫onBind方法時,只需要將其返回null即可疙教。onBind方法主要是用于給bindService方法調用Service時才會使用到棺聊。

onDestroy

onDestroy: 通過startService方法啟動的Service會無限期運行,只有當調用了Context的stopService或在Service內部調用stopSelf方法時贞谓,Service才會停止運行并銷毀限佩,在銷毀的時候會執(zhí)行Service回調函數(shù)。

bindService生命周期
image.png

bindService方式啟動Service主要有以下幾個生命周期函數(shù):

onCreate():
首次創(chuàng)建服務時裸弦,系統(tǒng)將調用此方法祟同。如果服務已在運行,則不會調用此方法理疙,該方法只調用一次晕城。
onStartCommand():
當另一個組件通過調用startService()請求啟動服務時,系統(tǒng)將調用此方法窖贤。
onDestroy():
當服務不再使用且將被銷毀時砖顷,系統(tǒng)將調用此方法。
onBind():
當另一個組件通過調用bindService()與服務綁定時主之,系統(tǒng)將調用此方法。
onUnbind():
當另一個組件通過調用unbindService()與服務解綁時李根,系統(tǒng)將調用此方法槽奕。
onRebind():
當舊的組件與服務解綁后,另一個新的組件與服務綁定房轿,onUnbind()返回true時粤攒,系統(tǒng)將調用此方法。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末囱持,一起剝皮案震驚了整個濱河市夯接,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纷妆,老刑警劉巖盔几,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掩幢,居然都是意外死亡逊拍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門际邻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芯丧,“玉大人,你說我怎么就攤上這事世曾∮Ш悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骗露。 經(jīng)常有香客問我岭佳,道長,這世上最難降的妖魔是什么椒袍? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任驼唱,我火速辦了婚禮,結果婚禮上驹暑,老公的妹妹穿的比我還像新娘玫恳。我一直安慰自己,他們只是感情好优俘,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布京办。 她就那樣靜靜地躺著,像睡著了一般帆焕。 火紅的嫁衣襯著肌膚如雪惭婿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天叶雹,我揣著相機與錄音财饥,去河邊找鬼。 笑死折晦,一個胖子當著我的面吹牛钥星,可吹牛的內容都是我干的。 我是一名探鬼主播满着,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谦炒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了风喇?” 一聲冷哼從身側響起宁改,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魂莫,沒想到半個月后还蹲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡耙考,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年秽誊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳骡。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锅论,死狀恐怖,靈堂內的尸體忽然破棺而出楣号,到底是詐尸還是另有隱情最易,我是刑警寧澤怒坯,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站藻懒,受9級特大地震影響剔猿,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嬉荆,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一归敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鄙早,春花似錦汪茧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弥虐,卻和暖如春扩灯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霜瘪。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工珠插, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颖对。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓捻撑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惜互。 傳聞我的和親對象是個殘疾皇子布讹,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 前言:本文所寫的是博主的個人見解琳拭,如有錯誤或者不恰當之處训堆,歡迎私信博主,加以改正白嘁!原文鏈接坑鱼,demo鏈接 Serv...
    PassersHowe閱讀 1,405評論 0 5
  • Android四大組件之ActivityAndroid四大組件之ServiceAndroid四大組件之Broadc...
    MonkeyLqj閱讀 2,204評論 0 4
  • 1.Service 是什么? Service 是 Android 中實現(xiàn)程序后臺運行的解決方案絮缅,非常適用于去執(zhí)行那...
    sssssss_閱讀 790評論 0 0
  • [文章內容來自Developers] Service是一個可以在后臺執(zhí)行長時間運行操作而不提供用戶界面的應用組件鲁沥。...
    岳小川閱讀 857評論 0 7
  • 轉載注明出處:http://www.reibang.com/p/a1d3d9693e91 1. 簡介 與前一篇An...
    王三的貓阿德閱讀 1,902評論 1 9