Android Service服務(wù)

一.基礎(chǔ)知識

1.Service是什么涩哟?

  • Service是一個一種在后臺執(zhí)行長時間運行操作而沒有用戶界面的應(yīng)用組件。不能做耗時操作添履。

2.進程

  • Service是一種不提供用戶交互頁面但是可以在后臺長時間運行的組件,可以通過在AndroidManifest.xml設(shè)置Service的android:process=":remote"屬性,讓Service運行另一個進程中庄涡,也就是說,雖然你是在當(dāng)前應(yīng)用啟動的這個Service搬设,但是這個Service和這個應(yīng)用并不是同一個進程穴店。

四大組件都支持android:process=":remote"這個屬性撕捍。

因為Service可以運行在不同的進程,這里說一下Android中幾種進程的優(yōu)先級泣洞,當(dāng)系統(tǒng)內(nèi)存不足時候忧风,系統(tǒng)會從優(yōu)先級低的進程開始回收,下面根據(jù)優(yōu)先級由高到低列出Android中幾種進程球凰。

  • 前臺進程狮腿,當(dāng)前用戶操作所需要的進程
    • 用戶正在交互的Activity(Activity執(zhí)行了onResume方法)
    • 與正在交互的Activity綁定的Service
    • 設(shè)置為前臺權(quán)限的Service(Service調(diào)用startForeground()方法)
    • 正在執(zhí)行某些生命周期回調(diào)的Service,onCreate()弟蚀、onStart()蚤霞、onDestroy()
    • 正在執(zhí)行onReceive()的BroadcastReceiver
      這種進程基本不會被回收,只有當(dāng)內(nèi)存不足以支持前臺進程同時運行時候义钉,系統(tǒng)才回回收它們昧绣,主要關(guān)注前三個。
  • 可見進程捶闸,沒有與用戶交互所必須的組件夜畴,但是在屏幕上仍然可見其內(nèi)容的進程
    • 調(diào)用了onPause()方法但仍對用戶可見的Activity
    • 與上面這種Activity綁定的Service
  • 服務(wù)進程,使用startService()啟動的Service且不屬于上面兩種類別進程的進程删壮,雖然這個進程與用戶交互沒有直接關(guān)系贪绘,但是一般會在后臺執(zhí)行一些耗時操作,所以央碟,只有當(dāng)內(nèi)存不足以維持所有前臺進程和可見進程同時運行税灌,系統(tǒng)才回回收這個類別的進程。
  • 后臺進程亿虽,對用戶不可見的Activity進程菱涤,已調(diào)用了onStop()方法的Activity
  • 空進程,不包含任何活動應(yīng)用組件的進程洛勉,保留這種進程唯一目的是作為緩存粘秆,縮短引用組件下次啟動時間。通常系統(tǒng)會最優(yōu)先回收這類進程收毫。

此外攻走,一個進程的級別可能會因為其他進程對它的依賴而有所提高,即進程A服務(wù)于進程B(B依賴A)此再,那么A的進程級別至少是和B一樣高的昔搂。

3. Service配置

和其他組件(Activity/ContentProvider/BroadcastReceiver)一樣,Service需要在Androidmanifest.xml中聲明引润。

Service.png

Service是運行在主線程中的巩趁,如果有什么耗時的操作,建議新建子線程去處理,避免阻塞主線程议慰,降低ANR的風(fēng)險蠢古。

4. 服務(wù)啟動方式

服務(wù)可以由其他組件啟動,而且如果用戶切換到其他應(yīng)用别凹,這個服務(wù)可能會繼續(xù)在后臺執(zhí)行草讶。到目前為止,Android中Service總共有三種啟動方式炉菲。

  • Scheduled堕战,可定時執(zhí)行的Service,是Android 5.0(API LEVEL 21)版本中新添加的一個Service拍霜,名為JobService嘱丢,繼承Service類,使用JobScheduler類調(diào)度它并且設(shè)置JobService運行的一些配置祠饺。具體文檔可以參考JobScheduler越驻,如果你的應(yīng)用最低支持版本是21,官方建議使用JobService道偷。
  • Started缀旁,通過startService()
    啟動的Service。通過這種方式啟動的Service會獨立的運行在后臺勺鸦,即使啟動它的組件已經(jīng)銷毀了并巍。例如Activity A使用startService()啟動了Service B,過了會兒换途,Activity A執(zhí)行onDestroy()被銷毀了懊渡,如果Service B任務(wù)沒有執(zhí)行完畢,它仍然會在后臺執(zhí)行军拟。這種啟動方式啟動的Service需要主動調(diào)用StopService()停止服務(wù)距贷。
  • Bound,通過bindService()
    啟動的Service吻谋。通過這種方式啟動Service時候,會返回一個客戶端交互接口现横,用戶可以通過這個接口與服務(wù)進行交互漓拾,如果這個服務(wù)是在另一個進程中,那么就實現(xiàn)了進程間通信戒祠,也就是Messenger和AIDL骇两,這個會是下篇文章的重點。多個組件可以同時綁定同一個Service姜盈,如果所有的組件都調(diào)用unbindService()解綁后低千,Service會被銷毀。

startService和bindService可以同時使用

服務(wù)一般分為兩種:

1:本地服務(wù), Local Service 用于應(yīng)用程序內(nèi)部示血。

  • 在Service可以調(diào)用Context.startService()啟動棋傍,調(diào)用Context.stopService()結(jié)束。 在內(nèi)部可以調(diào)用Service.stopSelf() 或 Service.stopSelfResult()來自己停止难审。無論調(diào)用了多少次startService()瘫拣,都只需調(diào)用一次 stopService()來停止。

2:遠程服務(wù)告喊, Remote Service 用于android系統(tǒng)內(nèi)部的應(yīng)用程序之間麸拄。

  • 可以定義接口并把接口暴露出來,以便其他應(yīng)用進行操作黔姜÷G校客戶端建立到服務(wù)對象的連接,并通過那個連接來調(diào)用服 務(wù)秆吵。調(diào)用Context.bindService()方法建立連接淮椰,并啟動,以調(diào)用 Context.unbindService()關(guān)閉連接帮毁。多個客戶端可以綁定至同一個服務(wù)实苞。如果服務(wù)此時還沒有加載,bindService()會先加 載它烈疚。提供給可被其他應(yīng)用復(fù)用黔牵,比如定義一個天氣預(yù)報服務(wù),提供與其他應(yīng)用調(diào)用即可爷肝。

那么先來看Service的生命周期吧:

Service生命周期.png
  • context.startService() ->onCreate()- >onStartCommand()->Service running--調(diào)用context.stopService() ->onDestroy()

  • context.bindService()->onCreate()->onBind()->Service running--調(diào)用>onUnbind() -> onDestroy()

從上訴可以知道分別對應(yīng)本地的猾浦,,以及遠程的灯抛,也對應(yīng)不同的方式啟動這個服務(wù)金赦。

二.注意事項

2.1 同一服務(wù),多次啟動对嚼,服務(wù)實際執(zhí)行的過程

  • 第一次 啟動服務(wù)時夹抗,運行 onCreate -->onStartCommand
    后面在啟動服務(wù)時,服務(wù)只執(zhí)行onStartCommand纵竖。在實際使用過程中漠烧,通過Intent 傳遞數(shù)據(jù),在OnStartCommand中執(zhí)行靡砌。

具體代碼如下:

Service.png
onStartCommand.png
startService.png
bindService.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末已脓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子通殃,更是在濱河造成了極大的恐慌度液,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異堕担,居然都是意外死亡已慢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門照宝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛇受,“玉大人,你說我怎么就攤上這事厕鹃【ぱ觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵剂碴,是天一觀的道長把将。 經(jīng)常有香客問我,道長忆矛,這世上最難降的妖魔是什么察蹲? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮催训,結(jié)果婚禮上洽议,老公的妹妹穿的比我還像新娘。我一直安慰自己漫拭,他們只是感情好亚兄,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著采驻,像睡著了一般审胚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礼旅,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天膳叨,我揣著相機與錄音,去河邊找鬼痘系。 笑死菲嘴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汰翠。 我是一名探鬼主播临谱,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奴璃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起城豁,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苟穆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雳旅,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡跟磨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了攒盈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抵拘。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖型豁,靈堂內(nèi)的尸體忽然破棺而出僵蛛,到底是詐尸還是另有隱情,我是刑警寧澤迎变,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布充尉,位于F島的核電站,受9級特大地震影響衣形,放射性物質(zhì)發(fā)生泄漏驼侠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一谆吴、第九天 我趴在偏房一處隱蔽的房頂上張望倒源。 院中可真熱鬧,春花似錦句狼、人聲如沸笋熬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽突诬。三九已至,卻和暖如春芜繁,著一層夾襖步出監(jiān)牢的瞬間旺隙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工骏令, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔬捷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓榔袋,卻偏偏與公主長得像周拐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凰兑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 描述 Service通呈揪總是稱之為“后臺服務(wù)”,其中“后臺”一詞是相對于前臺而言的誉裆,具體是指其本身的運行并不依賴于...
    pkqgo閱讀 667評論 1 3
  • Service概念 Service是一個可以在后臺執(zhí)行長時間運行操作而不提供用戶界面的應(yīng)用組件训柴。服務(wù)可由其他應(yīng)用組...
    水月心刀閱讀 815評論 0 1
  • 本文出自 Eddy Wiki 滩报,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,268評論 0 20
  • 原創(chuàng)作品,轉(zhuǎn)載請注明出處OService是Android四大組件之一播急,它主要是去執(zhí)行耗時操作(不需要與用戶交互并且...
    XiMiMax閱讀 3,945評論 4 6
  • 今天早上遠在故鄉(xiāng)母校的女同學(xué)突然給我發(fā)來了微信: “老李脓钾,我聽說龐少杰沒了∽” “上哪去了可训?” “聽說是心臟病發(fā)作...
    樹偉閱讀 2,359評論 77 43