Service-基礎梳理

請記住秒裕,如果你使用了服務瞒渠,它默認就運行于應用程序的主線程中。因此态鳖,如果服務執(zhí)行密集計算或者阻塞操作,你仍然應該在服務中創(chuàng)建一個新的線程來完成


onStartCommand()

當其它組件恶导,比如一個activity浆竭,通過調用startService()請求started方式的服務時,系統(tǒng)將會調用本方法惨寿。 一旦本方法執(zhí)行邦泄,服務就被啟動,并在后臺一直運行下去裂垦。 如果你的代碼實現(xiàn)了本方法顺囊,你就有責任在完成工作后通過調用stopSelf()stopService()終止服務。 (如果你只想提供bind方式蕉拢,那就不需要實現(xiàn)本方法特碳。)

如果組件通過調用startService()(這會導致onStartCommand()的調用)啟動了服務,那么服務將一直保持運行晕换,直至自行用stopSelf()終止或由其它組件調用stopService()來終止它午乓。

如果組件調用bindService()來創(chuàng)建服務(那onStartCommand()就不會被調用),則服務的生存期就與被綁定的組件一致闸准。一旦所有客戶端都對服務解除了綁定益愈,系統(tǒng)就會銷毀該服務。

與activity一樣,服務可以定義intent過濾器蒸其,使得其它組件能用隱式intent來調用服務敏释。 通過聲明intent過濾器,任何安裝在用戶設備上的應用程序組件都有能力來啟動你的服務摸袁,只要你的服務所聲明的intent過濾器與其它應用程序傳遞給startService()的intent相匹配即可钥顽。

此外,如果包含了android:exported屬性并且設置為"false"靠汁, 就可以確保該服務是你應用程序的私有服務耳鸯。即使服務提供了intent過濾器,本屬性依然生效膀曾。?


IntentService

這是Service類的子類县爬,它使用了工作(worker)線程來處理所有的啟動請求,每次請求都會啟動一個線程添谊。 如果服務不需要同時處理多個請求的話财喳,這是最佳的選擇。 所有你要做的工作就是實現(xiàn)onHandleIntent()即可斩狱,它會接收每個啟動請求的intent耳高,然后就可在后臺完成工作

IntentService將執(zhí)行以下步驟:

創(chuàng)建一個缺省的工作(worker)線程,它獨立于應用程序主線程來執(zhí)行所有發(fā)送到onStartCommand()的intent所踊。

好處:

創(chuàng)建一個工作隊列泌枪,每次向你的onHandleIntent()傳入一個intent,這樣你就永遠不必擔心多線程問題了秕岛。

在處理完所有的啟動請求后碌燕,終止服務,因此你就永遠不需調用stopSelf()了继薛。

提供缺省的onBind()實現(xiàn)代碼修壕,它返回null

提供缺省的onStartCommand()實現(xiàn)代碼遏考,它把intent送入工作隊列慈鸠,稍后會再傳給你的onHandleIntent()實現(xiàn)代碼。?


START_NOT_STICKY

如果系統(tǒng)在onStartCommand()返回后殺死了服務灌具,則不會重建服務了青团,除非還存在未發(fā)送的intent。 當服務不再是必需的咖楣,并且應用程序能夠簡單地重啟那些未完成的工作時督笆,這是避免服務運行的最安全的選項。

START_STICKY

如果系統(tǒng)在onStartCommand()返回后殺死了服務截歉,則將重建服務并調用onStartCommand()胖腾,但不會再次送入上一個intent烟零, 而是用null intent來調用onStartCommand() 瘪松。除非還有啟動服務的intent未發(fā)送完咸作,那么這些剩下的intent會繼續(xù)發(fā)送。 這適用于媒體播放器(或類似服務)宵睦,它們不執(zhí)行命令记罚,但需要一直運行并隨時待命。

START_REDELIVER_INTENT

如果系統(tǒng)在onStartCommand()返回后殺死了服務壳嚎,則將重建服務并用上一個已送過的intent調用onStartCommand()桐智。任何未發(fā)送完的intent也都會依次送入。這適用于那些需要立即恢復工作的活躍服務烟馅,比如下載文件说庭。

創(chuàng)建一個bound服務

要創(chuàng)建一個bound服務,你必須實現(xiàn)onBind()回調方法郑趁,并返回一個IBinder對象刊驴,此對象定義了與服務進行通信的接口。 然后寡润,其它應用程序組件可以調用bindService()來獲得接口并調用服務中的方法捆憎。 服務只在為綁定的應用程序組件工作時才會存活,因此梭纹,只要沒有組件綁定到服務躲惰,系統(tǒng)就會自動銷毀服務(你不需要像started服務中那樣通過onStartCommand()來終止一個bound服務)。

同一個服務可以被多個客戶端綁定变抽。當客戶端完成交互時础拨,會調用unbindService()來解除綁定。一旦不存在客戶端與服務綁定時绍载,系統(tǒng)就會銷毀該服務太伊。

一旦開始運行,服務就能夠利用toast通知或狀態(tài)欄通知把事件通知給用戶逛钻。?


在前臺運行服務

要把你的服務請求為前臺運行僚焦,可以調用startForeground()方法。此方法有兩個參數:唯一標識通知的整數值曙痘、狀態(tài)欄通知Notification對象芳悲。例如:

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),System.currentTimeMillis());

Intent notificationIntent = new Intent(this, ExampleActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

notification.setLatestEventInfo(this, getText(R.string.notification_title),

getText(R.string.notification_message), pendingIntent);

startForeground(ONGOING_NOTIFICATION, notification);

要從前臺移除服務,請調用stopForeground()方法边坤,這個方法接受個布爾參數名扛,表示是否同時移除狀態(tài)欄通知。此方法不會終止服務茧痒。不過肮韧,如果服務在前臺運行時被你終止了,那么通知也會同時被移除。

不管是用startService()創(chuàng)建的弄企,還是用bindService()創(chuàng)建的超燃,所有的服務都會調用onCreate()和onDestroy()方法。?

from->http://www.android-doc.com/guide/components/services.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拘领,一起剝皮案震驚了整個濱河市意乓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌约素,老刑警劉巖届良,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異圣猎,居然都是意外死亡士葫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門送悔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來为障,“玉大人,你說我怎么就攤上這事放祟△⒃梗” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵跪妥,是天一觀的道長鞋喇。 經常有香客問我,道長眉撵,這世上最難降的妖魔是什么侦香? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮纽疟,結果婚禮上暇仲,老公的妹妹穿的比我還像新娘调榄。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布顶掉。 她就那樣靜靜地躺著蛆封,像睡著了一般拴竹。 火紅的嫁衣襯著肌膚如雪掉奄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天炎功,我揣著相機與錄音枚冗,去河邊找鬼。 笑死蛇损,一個胖子當著我的面吹牛赁温,可吹牛的內容都是我干的坛怪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼股囊,長吁一口氣:“原來是場噩夢啊……” “哼袜匿!你這毒婦竟也來了?” 一聲冷哼從身側響起毁涉,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锈死,沒想到半個月后贫堰,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡待牵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年其屏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缨该。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡偎行,死狀恐怖,靈堂內的尸體忽然破棺而出贰拿,到底是詐尸還是另有隱情蛤袒,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布膨更,位于F島的核電站妙真,受9級特大地震影響,放射性物質發(fā)生泄漏荚守。R本人自食惡果不足惜珍德,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矗漾。 院中可真熱鬧锈候,春花似錦、人聲如沸敞贡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊役。三九已至虑稼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間势木,已是汗流浹背蛛倦。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啦桌,地道東北人溯壶。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓及皂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親且改。 傳聞我的和親對象是個殘疾皇子验烧,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容

  • 前言:本文所寫的是博主的個人見解,如有錯誤或者不恰當之處又跛,歡迎私信博主碍拆,加以改正!原文鏈接慨蓝,demo鏈接 Serv...
    PassersHowe閱讀 1,408評論 0 5
  • 【Android Service】 Service 簡介(★★★) 很多情況下感混,一些與用戶很少需要產生交互的應用程...
    Rtia閱讀 3,143評論 1 21
  • [文章內容來自Developers] Service是一個可以在后臺執(zhí)行長時間運行操作而不提供用戶界面的應用組件。...
    岳小川閱讀 860評論 0 7
  • 服務基本上分為兩種形式 啟動 當應用組件(如 Activity)通過調用 startService() 啟動服務時...
    pifoo閱讀 1,262評論 0 8
  • 2017-9-21 星期四 天氣晴 寶貝年齡:7周歲6個月和1周7個月 學經周期:4年礼烈。 學經人員:琦琦弧满,雨珂,琦...
    廈門琦心媽閱讀 452評論 1 4