android中Service使用startService

android中Service使用startService

兩種情況得運(yùn)用場(chǎng)景:

1屁奏、用于長(zhǎng)期執(zhí)行某些操作对室,并且甚至與UI(主)線程沒有交互蜡秽。比如啟動(dòng)app直接去網(wǎng)絡(luò)下載文件

2蚤氏、跨進(jìn)程間通信代赁,比如appA程序中Service被appB中程序調(diào)用

注意:Service默認(rèn)時(shí)運(yùn)行在它所在的宿主進(jìn)程的主進(jìn)程中扰她,也就是說如果我們?cè)赟ervice中做耗時(shí)工作,UI(主)線程會(huì)卡死芭碍,出現(xiàn)ARN程序無響應(yīng)現(xiàn)象徒役。為了防止這種情況出現(xiàn),我們一般都是在Service中創(chuàng)建一個(gè)新的線程來處理一些耗時(shí)工作窖壕,這樣就不會(huì)阻塞主線程忧勿。從這里也側(cè)面反映了Service不是另一個(gè)獨(dú)立的進(jìn)程,Service自己本身不會(huì)開辟新的進(jìn)程艇拍,除非手動(dòng)來設(shè)置狐蜕。默認(rèn)情況下,Service是運(yùn)行在本運(yùn)用程序所屬的進(jìn)程中卸夕。

Service啟動(dòng)模式也有兩種层释,分別是:startService和bindService

1、通過startService方式啟動(dòng)

如果運(yùn)行在后臺(tái)的Service甚至不需要和UI(主)線程間進(jìn)行交互快集,這種情況下贡羔,一般是調(diào)用startService來啟動(dòng)Service。

2个初、通過bindService方式啟動(dòng)

兩個(gè)不同進(jìn)程間通信或者某個(gè)應(yīng)用中Service方法的暴露出去(同個(gè)進(jìn)程間)乖寒,一般是調(diào)用bindService來啟動(dòng)Service。

onCreate:如果多次執(zhí)行了Context的startService方法啟動(dòng)Service院溺,Service方法的onCreate方法只會(huì)在第一次創(chuàng)建Service的時(shí)候調(diào)用一次楣嘁,以后均不會(huì)再次調(diào)用。我們可以在onCreate方法中完成一些Service初始化相關(guān)的操作

onStartCommand:如果多次執(zhí)行了Context的startService方法,那么Service的onStartCommand方法也會(huì)相應(yīng)的多次調(diào)用逐虚。onStartCommand方法很重要聋溜,我們?cè)谠摲椒ㄖ懈鶕?jù)傳入的Intent參數(shù)進(jìn)行實(shí)際的操作,比如會(huì)在此處創(chuàng)建一個(gè)線程用于下載數(shù)據(jù)或播放音樂等

onBind:Service中的onBind方法是個(gè)抽象方法叭爱,所以Service類本身就是一個(gè)抽象類撮躁,也就是說onBind方法必須要重寫,即使用不到买雾。通過startService使用Service時(shí)把曼,我們?cè)谥貙憃nBind方法時(shí),只需要將其返回值設(shè)為null即可漓穿。onBind方法主要是用于給bindService方法調(diào)用Service時(shí)才使用到嗤军。

onDestiny:Service銷毀時(shí)回調(diào)函數(shù)

如果Service啟動(dòng)后沒有去停止掉它,它會(huì)一直運(yùn)行下去晃危,停止startService啟動(dòng)的Service有兩種方法:

1型雳、在外部調(diào)用stopService

2、在Service內(nèi)部調(diào)用stopSelf方法

值得注意的是在onStartCommand中返回值山害,常用的返回值有:START_NOT_STICKY纠俭、START_SICKY和START_REDELIVER_INTENT,這三個(gè)都是靜態(tài)常理值。

START_NOT_STICKY:表示當(dāng)Service運(yùn)行的進(jìn)程被Android系統(tǒng)強(qiáng)制殺掉之后浪慌,不會(huì)重新創(chuàng)建該Service冤荆,如果想重新實(shí)例化該Service,就必須重新調(diào)用startService來啟動(dòng)权纤。

使用場(chǎng)景:表示當(dāng)Service在執(zhí)行工作中被中斷幾次無關(guān)緊要或者對(duì)Android內(nèi)存緊張的情況下需要被殺掉且不會(huì)立即重新創(chuàng)建這種行為也可接受的話钓简,這是可以在onStartCommand返回值中設(shè)置該值。如在Service中定時(shí)從服務(wù)器中獲取最新數(shù)據(jù)

START_STICKY:表示Service運(yùn)行的進(jìn)程被Android系統(tǒng)強(qiáng)制殺掉之后汹想,Android系統(tǒng)會(huì)將該Service依然設(shè)置為started狀態(tài)(即運(yùn)行狀態(tài))外邓,但是不再保存onStartCommand方法傳入的intent對(duì)象,然后Android系統(tǒng)會(huì)嘗試再次重新創(chuàng)建該Service古掏,并執(zhí)行onStartCommand回調(diào)方法损话,這時(shí)onStartCommand回調(diào)方法的Intent參數(shù)為null,也就是onStartCommand方法雖然會(huì)執(zhí)行但是獲取不到intent信息槽唾。

使用場(chǎng)景:如果你的Service可以在任意時(shí)刻運(yùn)行或結(jié)束都沒什么問題丧枪,而且不需要intent信息,那么就可以在onStartCommand方法中返回START_STICKY庞萍,比如一個(gè)用來播放背景音樂功能的Service就適合返回該值拧烦。

START_REDELIVER_INTENT:表示Service運(yùn)行的進(jìn)程被Android系統(tǒng)強(qiáng)制殺掉之后,與返回START_STICKY的情況類似钝计,Android系統(tǒng)會(huì)將再次重新創(chuàng)建該Service恋博,并執(zhí)行onStartCommand回調(diào)方法齐佳,但是不同的是,Android系統(tǒng)會(huì)再次將Service在被殺掉之前最后一次傳入onStartCommand方法中的Intent再次保留下來并再次傳入到重新創(chuàng)建后的Service的onStartCommand方法中债沮,這樣我們就能讀取到intent參數(shù)重虑。

使用場(chǎng)景:如果我們的Service需要依賴具體的Intent才能運(yùn)行(需要從Intent中讀取相關(guān)數(shù)據(jù)信息等),并且在強(qiáng)制銷毀后有必要重新創(chuàng)建運(yùn)行秦士,那么這樣的Service就適合返回START_REDELIVER_INTENT。

接著補(bǔ)充一個(gè)知識(shí)點(diǎn)永高,Service進(jìn)一步的封裝類IntentService由于Service是運(yùn)行在UI(主)線程中隧土,會(huì)帶來UI阻塞,所以在操作耗時(shí)工作時(shí)命爬,都在onStartCommand中開啟一個(gè)新的線程去執(zhí)行一些耗時(shí)工作曹傀。正因?yàn)檫@樣,創(chuàng)建一個(gè)帶有工作線程Service是很常見的(因?yàn)楣ぷ骶€程不會(huì)阻塞主線程)梅屉,為了簡(jiǎn)化程序員工作量娃磺,Android額外開發(fā)了一個(gè)類那就是IntentService

IntentService特點(diǎn):

1. IntentService

自帶一個(gè)工作線程沪袭,當(dāng)我們的Service中做一些阻塞UI(主)線程工作時(shí),可以使用IntentService幕庐。

2.將我們實(shí)際要做的工作放入到IntentService的onHandleIntent方法中處理,并且onHandleIntent運(yùn)行在IntentService所持有的工作線程中家淤,而非主線程异剥。

3.當(dāng)多次啟動(dòng)IntentService,產(chǎn)生多個(gè)job絮重,IntentService只能一個(gè)一個(gè)處理冤寿,也就是按照先后順序進(jìn)行處理。先將intent1傳入onHandleIntent青伤,讓其完成job1督怜,然后將intent2傳入onHandleIntent,讓其完成job2…這樣直至所有job完成狠角,所以我們IntentService不能并行地執(zhí)行多個(gè)job号杠,只能一個(gè)一個(gè)的按照先后順序完成,當(dāng)所有job完成的時(shí)候IntentService就銷毀了丰歌,會(huì)執(zhí)行onDestroy回調(diào)方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末究流,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子动遭,更是在濱河造成了極大的恐慌芬探,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厘惦,死亡現(xiàn)場(chǎng)離奇詭異偷仿,居然都是意外死亡哩簿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門酝静,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节榜,“玉大人,你說我怎么就攤上這事别智∽诓裕” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵薄榛,是天一觀的道長(zhǎng)讳窟。 經(jīng)常有香客問我,道長(zhǎng)敞恋,這世上最難降的妖魔是什么丽啡? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮硬猫,結(jié)果婚禮上补箍,老公的妹妹穿的比我還像新娘。我一直安慰自己啸蜜,他們只是感情好坑雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衬横,像睡著了一般霞丧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冕香,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天蛹尝,我揣著相機(jī)與錄音,去河邊找鬼悉尾。 笑死突那,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的构眯。 我是一名探鬼主播愕难,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惫霸!你這毒婦竟也來了猫缭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤壹店,失蹤者是張志新(化名)和其女友劉穎猜丹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硅卢,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡射窒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年藏杖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脉顿。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝌麸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艾疟,到底是詐尸還是另有隱情来吩,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布蔽莱,位于F島的核電站弟疆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碾褂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一历葛、第九天 我趴在偏房一處隱蔽的房頂上張望正塌。 院中可真熱鬧,春花似錦恤溶、人聲如沸乓诽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠天。三九已至,卻和暖如春帐姻,著一層夾襖步出監(jiān)牢的瞬間稠集,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工饥瓷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剥纷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓呢铆,卻偏偏與公主長(zhǎng)得像晦鞋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棺克,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 前言:本文所寫的是博主的個(gè)人見解悠垛,如有錯(cuò)誤或者不恰當(dāng)之處,歡迎私信博主娜谊,加以改正确买!原文鏈接,demo鏈接 Serv...
    PassersHowe閱讀 1,413評(píng)論 0 5
  • 本文出自 Eddy Wiki 纱皆,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,265評(píng)論 0 20
  • 服務(wù)基本上分為兩種形式 啟動(dòng) 當(dāng)應(yīng)用組件(如 Activity)通過調(diào)用 startService() 啟動(dòng)服務(wù)時(shí)...
    pifoo閱讀 1,270評(píng)論 0 8
  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/a1d3d9693e91 1. 簡(jiǎn)介 與前一篇An...
    王三的貓阿德閱讀 1,906評(píng)論 1 9
  • 打針時(shí)代 這,是空前的時(shí)代,是絕無僅有的時(shí)代.人們?nèi)孢M(jìn)入了打針的風(fēng)潮當(dāng)中,無論是發(fā)生了什么事,其結(jié)局都引向了打針...
    許你故作姿態(tài)閱讀 433評(píng)論 0 2