Android service啟動(dòng)不執(zhí)行onStartCommand

最近項(xiàng)目開發(fā)中遇到一個(gè)怪象:在設(shè)置中將app已獲取的location權(quán)限關(guān)閉后忙芒,app進(jìn)程被殺死朝群,通過守護(hù)進(jìn)程重新啟動(dòng)app主進(jìn)程并同時(shí)啟動(dòng)后臺(tái)服務(wù)Service饮醇,此時(shí)app進(jìn)程很快就啟動(dòng)硕蛹,但是Service只是執(zhí)行了onCreat沒有進(jìn)一步執(zhí)行onStartCommand岸更。且在啟動(dòng)Service時(shí)偶現(xiàn)ANR鸵膏。針對(duì)該象限做一下研究分析:

關(guān)閉location權(quán)限關(guān)閉后,app進(jìn)程被殺

  • Android已授權(quán)的app怎炊,手動(dòng)在設(shè)置中取消某個(gè)授權(quán)谭企,該app主進(jìn)程會(huì)被殺死,這是Android系統(tǒng)機(jī)制评肆。

Service啟動(dòng)只執(zhí)行onCreat沒有執(zhí)行onStartCommand

  • 出現(xiàn)該現(xiàn)象原因是:在守護(hù)闭椋活進(jìn)程中啟動(dòng)Service時(shí),由于出現(xiàn)ANR而將啟動(dòng)執(zhí)行放到Thread中執(zhí)行導(dǎo)致的糟港。將執(zhí)行邏輯從Thread中移出來即可解決該現(xiàn)象攀操。【但是經(jīng)驗(yàn)證單純將Service啟動(dòng)放到Thread中執(zhí)行是正常的】雖然問題已解決但是這里還沒有定位到到底是什么導(dǎo)致該現(xiàn)象,有大俠知道煩請留言告知秸抚,謝謝

Service與Thread的區(qū)別

  • 對(duì)Service了解后速和,會(huì)發(fā)現(xiàn)它實(shí)現(xiàn)的大部分功能使用Thread也可以解決,并且Thread使用起來比Service方便的多剥汤,那么為什么還需要使用Service呢颠放,下面來詳細(xì)解釋一下。

  • 首先吭敢,Thread是程序執(zhí)行的最小單元碰凶,它是分配系統(tǒng)資源的基本單位,主要用于執(zhí)行一些異步的操作鹿驼。而Service是Android的一種機(jī)制欲低,當(dāng)它使用bindService()被綁定的時(shí)候,是運(yùn)行在宿主主進(jìn)程的主線程上的畜晰,當(dāng)使用startService()啟動(dòng)服務(wù)的時(shí)候砾莱,是獨(dú)立運(yùn)行在獨(dú)立進(jìn)程的主線程上的,因此它們的核心沒有任何關(guān)系凄鼻。

  • 其次腊瑟,對(duì)于Thread而言,它是獨(dú)立于啟動(dòng)它的組件的块蚌,如使用一個(gè)Activity啟動(dòng)了一個(gè)Thread闰非,當(dāng)這個(gè)Activity被銷毀前,沒有主動(dòng)停止Thread或者Thread的run()方法沒有執(zhí)行完畢的話峭范,Thread也會(huì)一直執(zhí)行下去财松,這樣就很容易導(dǎo)致一些問題,當(dāng)這個(gè)Activity被銷毀之后纱控,將不再持有這個(gè)Thread的引用辆毡,也就是說政敢,無法再在另外一個(gè)Activity中對(duì)同一個(gè)Thread進(jìn)行控制。而Service不同胚迫,在Android系統(tǒng)中,無論啟動(dòng)或綁定幾次唾那,只會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的Service實(shí)例访锻,所以只要這個(gè)Service在運(yùn)行,就可以在能獲取到Context對(duì)象的地方控制它闹获,這些特點(diǎn)是Thread無法做到的期犬。

JobService與Service

對(duì)比角度 Service JobService 補(bǔ)充
實(shí)現(xiàn)原理 由APP側(cè)發(fā)出請求,ActivityManagerService接收請求后進(jìn)行調(diào)度避诽,通知APP側(cè)進(jìn)行創(chuàng)建龟虎,開始(綁定),停止(解綁)和銷毀Service沙庐。 由APP側(cè)發(fā)出請求鲤妥,JobSchedulerService接收請求后,通過ActivityManagerService去調(diào)度JobService的創(chuàng)建拱雏,綁定和解綁棉安。并由JobSchedulerService自己進(jìn)行JobService的開始,取消和停止等操作铸抑。 從原理上看贡耽,JobService的開始,取消和停止是由JobSchedulerService維護(hù)的鹊汛,而不是由ActivityManagerService維護(hù)的蒲赂。這是他們在實(shí)現(xiàn)原理上的明顯區(qū)別。即JobService是由系統(tǒng)負(fù)責(zé)調(diào)用和維護(hù)
啟動(dòng)條件 Service的啟動(dòng)并沒有什么特定的條件設(shè)置刁憋。如果說非要有什么具體的執(zhí)行條件的話滥嘴,就是APP側(cè)自己根據(jù)業(yè)務(wù)邏輯在適當(dāng)?shù)臅r(shí)候調(diào)用startService()或者bindService()。 JobService的執(zhí)行需要至少一個(gè)條件职祷。沒有條件的JobService是無法啟動(dòng)的氏涩,在創(chuàng)建JobInfo的時(shí)候會(huì)拋出異常。
運(yùn)行時(shí)間 onStartCommand()的回調(diào)在UI線程有梆,不可執(zhí)行耗時(shí)邏輯是尖,否則可能造成ANR。 onStartJob()的回調(diào)在UI線程泥耀,不可執(zhí)行耗時(shí)邏輯饺汹,否則可能造成ANR或者Job被強(qiáng)制銷毀(超過8s)。并且痰催,JobService里即便新起了線程兜辞,處理的時(shí)間也不能超過10min迎瞧,否則Job將被強(qiáng)制銷毀。
啟動(dòng)角度 onStartCommand()里返回START_STICKY可以告訴AMS在被停止后自動(dòng)啟動(dòng)逸吵。 onStopJob()里返回true凶硅,即可在被強(qiáng)制停止后再度啟動(dòng)起來。
擴(kuò)展性 APP側(cè)可以通過Binder創(chuàng)建遠(yuǎn)程Service進(jìn)行IPC扫皱。 JobService的綁定實(shí)際上是由JobSchedulerService自己去做的足绅。綁定后產(chǎn)生的Binder用于和JobSchedulerService進(jìn)行IPC,APP側(cè)無法通過JobService擴(kuò)展去實(shí)現(xiàn)別的IPC功能韩脑。 Google本來的初衷也不是讓JobService實(shí)現(xiàn)遠(yuǎn)程Service的功能氢妈。
實(shí)際應(yīng)用上 適合需要常駐后臺(tái),立即執(zhí)行段多,進(jìn)行數(shù)據(jù)獲取首量,功能維持的場景。比如 音樂播放进苍,定位加缘,郵件收發(fā)等。 適合不需要常駐后臺(tái)琅捏,不需要立即執(zhí)行生百,在某種條件下觸發(fā),執(zhí)行簡單任務(wù)的場景柄延。比如 聯(lián)系人信息變化后的快捷方式的更新蚀浆,定期的更新電話程序的聯(lián)系人信息,壁紙更改后去從壁紙?zhí)崛☆伾暮笈_(tái)任務(wù)搜吧。

簡單來講市俊,Service適合一些優(yōu)先級(jí)較高,執(zhí)行任務(wù)復(fù)雜耗時(shí)的任務(wù)滤奈。JobService適合輕量級(jí)的靈活的任務(wù)摆昧。

參考內(nèi)容:
https://www.catbro.cn/detail/5c394d0584063683a872a591.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評(píng)論聯(lián)系作者蜒程。
  • 序言:七十年代末绅你,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昭躺,更是在濱河造成了極大的恐慌忌锯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件领炫,死亡現(xiàn)場離奇詭異偶垮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門似舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脚猾,“玉大人,你說我怎么就攤上這事砚哗×” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蛛芥,是天一觀的道長泌参。 經(jīng)常有香客問我,道長常空,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任盖溺,我火速辦了婚禮漓糙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烘嘱。我一直安慰自己昆禽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布蝇庭。 她就那樣靜靜地躺著醉鳖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哮内。 梳的紋絲不亂的頭發(fā)上盗棵,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音北发,去河邊找鬼纹因。 笑死,一個(gè)胖子當(dāng)著我的面吹牛琳拨,可吹牛的內(nèi)容都是我干的瞭恰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狱庇,長吁一口氣:“原來是場噩夢啊……” “哼惊畏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起密任,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤颜启,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后批什,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體农曲,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乳规。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片形葬。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖暮的,靈堂內(nèi)的尸體忽然破棺而出笙以,到底是詐尸還是另有隱情,我是刑警寧澤冻辩,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布猖腕,位于F島的核電站,受9級(jí)特大地震影響恨闪,放射性物質(zhì)發(fā)生泄漏倘感。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一咙咽、第九天 我趴在偏房一處隱蔽的房頂上張望老玛。 院中可真熱鬧,春花似錦钧敞、人聲如沸蜡豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜廉。三九已至,卻和暖如春愚战,著一層夾襖步出監(jiān)牢的瞬間娇唯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工寂玲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留视乐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓敢茁,卻偏偏與公主長得像佑淀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彰檬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 1.Service 是什么伸刃? Service 是 Android 中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案,非常適用于去執(zhí)行那...
    sssssss_閱讀 801評(píng)論 0 0
  • 前言:本文所寫的是博主的個(gè)人見解逢倍,如有錯(cuò)誤或者不恰當(dāng)之處捧颅,歡迎私信博主,加以改正较雕!原文鏈接碉哑,demo鏈接 Serv...
    PassersHowe閱讀 1,413評(píng)論 0 5
  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/a1d3d9693e91 1. 簡介 與前一篇An...
    王三的貓阿德閱讀 1,906評(píng)論 1 9
  • 原文https://blog.csdn.net/imxiangzi/article/details/7603997...
    空山Echo閱讀 1,260評(píng)論 0 0
  • Service是一個(gè)可以在后臺(tái)執(zhí)行長時(shí)間運(yùn)行操作而不提供用戶界面的應(yīng)用組件挚币,由其他應(yīng)用組件啟動(dòng),即時(shí)切換到其他應(yīng)用...
    Discredited閱讀 579評(píng)論 0 1