Android service筆記

這個真拖延太久了傻寂,必須把這個筆記完成。儿普,崎逃,看了一下2016年的草稿掷倔,從Android 6.0 這都要10.0了眉孩。


一、Service釋義、作用浪汪、分類巴柿。

Service是Android應(yīng)用程序中的一個組件,與用戶不進(jìn)行交互死遭,可以長期的執(zhí)行在后臺广恢。
分類:
Android O 之前,創(chuàng)建前臺服務(wù)的方式通常是先創(chuàng)建一個后臺服務(wù)呀潭,然后將該服務(wù)推到前臺钉迷。Android O及Android P,系統(tǒng)不允許后臺應(yīng)用創(chuàng)建后臺服務(wù)钠署,Android O 引入了一種全新的方法糠聪,即ContextCompat.startForegroundService() ,以在前臺啟動新服務(wù)谐鼎。Service分為如下三類

1.foreground service
fg Service執(zhí)行一些對于用戶來說是可感知的操作舰蟆,如audio應(yīng)用使用fg service來播放歌曲。
2.background service
bg service執(zhí)行的操作對用戶而言是不可感知的狸棍。
3.bound service
bound service主要是提供c/s接口身害,允許組件與service進(jìn)行通信,或者是跨進(jìn)程的通信草戈。
這是由于啟動方式的不同導(dǎo)致了三種service,

startService -> background service.
startForegroundService -> foreground service
bindService -> bound service

二塌鸯、使用

2.1聲明

Service是Android中的四大組件,使用它一定要在AndroidManifest.xml中聲明猾瘸,在AndroidManifest.xml中聲明是為了讓PackageManagerService能解析出該Service, 并建立對應(yīng)的數(shù)據(jù)結(jié)構(gòu)

 <service android:name=".myservice"
        android:enabled="true"
        android:exported="true"
        android:icon="@drawable/background_blue"
        android:label="string"
        android:process="string"
        android:permission="string">
 </service>

說明:

    name:服務(wù)的路徑
    enabled:表示系統(tǒng)是否能夠?qū)嵗摻M件
    exported:表示該服務(wù)是否能夠被其他應(yīng)用程序組件所調(diào)用或者交互
    android:process 是否需要在單獨的進(jìn)程中運行,當(dāng)設(shè)置為android:process=”:remote”時界赔,代表Service在單獨的進(jìn)程中運行。注意“:”很重要牵触,它的意思是指要在當(dāng)前進(jìn)程名稱前面附加上當(dāng)前的包名淮悼,所以“remote”和”:remote”不是同一個意思,前者的進(jìn)程名稱為:remote揽思,而后者的進(jìn)程名稱為:App-packageName:remote袜腥。
    android:isolatedProcess     設(shè)置 true 意味著,服務(wù)會在一個特殊的進(jìn)程下運行钉汗,這個進(jìn)程與系統(tǒng)其他進(jìn)程分開且沒有自己的權(quán)限羹令。與其通信的唯一途徑是通過服務(wù)的API(bind and start)。

2.2啟動

1.startService()
startService()開啟服務(wù)時服務(wù)執(zhí)行的生命周期方法是

onCreate()----onStartCommand()-----onStop()----onDestory()

其中onCreate()會在服務(wù)第一次創(chuàng)建的時候調(diào)用损痰,當(dāng)多次調(diào)用startService方法的時候福侈,onCreate只會執(zhí)行一次,而onStartCommand會執(zhí)行多次卢未,onDestroy方法會在服務(wù)銷毀的時候進(jìn)行調(diào)用
服務(wù)的銷毀 該方式下啟動的服務(wù)可以調(diào)用stopService(Intent intent)或者stopSelf()來進(jìn)行服務(wù)的銷毀肪凛。
2.bindService
bindService綁定服務(wù)時服務(wù)執(zhí)行的生命周期方法是

onCreate()----onBind()-----onUnbind()----onStop()----onDestory()

onCreate堰汉,onBind 會在bindService第一次調(diào)用的時候去執(zhí)行,如果多次調(diào)用bindService伟墙,onCreate和onBind也就執(zhí)行一次翘鸭,onUnbind和onDestroy會在解綁服務(wù)的時候進(jìn)行調(diào)用。
服務(wù)的解綁 該方式下綁定的服務(wù)需要調(diào)用unbindService(ServiceConnection mConnection)方法來進(jìn)行服務(wù)的解綁操作戳葵。
綁定服務(wù)的最大作用就是用來實現(xiàn)對Service執(zhí)行的任務(wù)進(jìn)行進(jìn)度監(jiān)控就乓。

三、筆記

3.1

服務(wù)類似于其他應(yīng)用程序的對象拱烁,運行在主線程中生蚁。這就意味著你如果在服務(wù)中進(jìn)行耗時的操作,你需要開啟一個子線程去處理這個操作戏自,不然在服務(wù)中超過20秒未響應(yīng)會發(fā)生ANR導(dǎo)致程序崩潰守伸。IntentService的出現(xiàn)就是為了解決在服務(wù)中操作耗時任務(wù)的。

3.2

在Android中綁定式服務(wù)bindService會隨著Activity的結(jié)束而結(jié)束浦妄,但是啟動式服務(wù)startService不受Activity的影響尼摹。

3.3service與線程的區(qū)別

Thread 是程序執(zhí)行的最小單元,它是分配CPU的基本單位剂娄,android系統(tǒng)中UI線程也是線程的一種蠢涝,當(dāng)然Thread還可以用于執(zhí)行一些耗時異步的操作。

Service是Android的一種機制阅懦,服務(wù)是運行在主線程上的和二,它是由系統(tǒng)進(jìn)程托管。它與其他組件之間的通信類似于client和server耳胎,是一種輕量級的IPC通信惯吕,這種通信的載體是binder,它是在linux層交換信息的一種IPC怕午,而所謂的Service后臺任務(wù)只不過是指沒有UI的組件罷了废登。
二者沒有任何關(guān)系

3.3 顯/隱式 啟動

//顯示啟動
Intent intent = new Intent(this,ForegroundService.class);
startService(intent);

隱式啟動:
但是Android 5.0一出來后,其中有個特性就是Service Intent must be explitict郁惜,也就是說從Lollipop開始堡距,service服務(wù)必須采用顯示方式啟動。 需要設(shè)置一個Action兆蕉,我們可以把Action的名字設(shè)置成Service的全路徑名字羽戒,在這種情況下android:exported默認(rèn)為true。

3.4兼容處理

Android 8.0 還對特定函數(shù)做出了以下變更:

  • 如果針對 Android 8.0 的應(yīng)用嘗試在不允許其創(chuàng)建后臺服務(wù)的情況下使用 startService() 函數(shù)虎韵,則該函數(shù)將引發(fā)一個 IllegalStateException易稠。
  • 新的 Context.startForegroundService() 函數(shù)將啟動一個前臺服務(wù)。現(xiàn)在包蓝,即使應(yīng)用在后臺運行驶社,系統(tǒng)也允許其調(diào)用 Context.startForegroundService()呆奕。不過,應(yīng)用必須在創(chuàng)建服務(wù)后的五秒內(nèi)調(diào)用該服務(wù)的 startForeground() 函數(shù)衬吆。
 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
    } else {
    context.startService(intent);
    }

startForegroundService中主要是通知創(chuàng)建service 并發(fā)送一個延遲5s的msg,5s后就會拋出異常绳泉。
在service創(chuàng)建之后會調(diào)用onCreate中手動添加的startForeground逊抡,它的作用是添加notification避免 “null notification”(startForeground方法參數(shù)會傳入一個notification);同時移除了startForegroundService中發(fā)出的超時msg 避免了Context.startForegroundService() did not then call Service.startForeground()異常零酪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冒嫡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子四苇,更是在濱河造成了極大的恐慌孝凌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月腋,死亡現(xiàn)場離奇詭異蟀架,居然都是意外死亡,警方通過查閱死者的電腦和手機榆骚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門片拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妓肢,你說我怎么就攤上這事捌省。” “怎么了碉钠?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵纲缓,是天一觀的道長。 經(jīng)常有香客問我喊废,道長祝高,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任污筷,我火速辦了婚禮褂策,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颓屑。我一直安慰自己斤寂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布揪惦。 她就那樣靜靜地躺著遍搞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪器腋。 梳的紋絲不亂的頭發(fā)上溪猿,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天钩杰,我揣著相機與錄音,去河邊找鬼诊县。 笑死讲弄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的依痊。 我是一名探鬼主播避除,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胸嘁!你這毒婦竟也來了瓶摆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤性宏,失蹤者是張志新(化名)和其女友劉穎群井,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毫胜,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡书斜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酵使。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩佑。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凝化,靈堂內(nèi)的尸體忽然破棺而出稍坯,到底是詐尸還是另有隱情,我是刑警寧澤搓劫,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布瞧哟,位于F島的核電站,受9級特大地震影響枪向,放射性物質(zhì)發(fā)生泄漏勤揩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一秘蛔、第九天 我趴在偏房一處隱蔽的房頂上張望陨亡。 院中可真熱鬧,春花似錦深员、人聲如沸负蠕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遮糖。三九已至,卻和暖如春叠赐,著一層夾襖步出監(jiān)牢的瞬間欲账,已是汗流浹背屡江。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赛不,地道東北人惩嘉。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像踢故,于是被迫代替她去往敵國和親文黎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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

  • 首先祝各位大寶寶們畴椰,今天兒童節(jié)快樂!知道各位寶寶都睡啦鸽粉,對我來說可能因為今天是個特殊的日子斜脂,導(dǎo)致現(xiàn)在怎么睡都睡不著...
    寬哥哥閱讀 296評論 0 4
  • 我把石頭扔進(jìn)河川 以為能引起波瀾 誰知道啊 還有觸底的反彈 砸壞了欄桿
    苜蓿巷三號閱讀 281評論 0 2
  • setTimeout函數(shù)是面試中經(jīng)常拿來出題的一個函數(shù),可以引出很多比較關(guān)鍵的知識點触机,這篇文章就通過一個setTi...
    Mavericker閱讀 272評論 0 0
  • 多少繁華歲月經(jīng)不住時間洗禮,多少懵懂情愫熬不過時間流轉(zhuǎn)蔬胯,多少豪情壯志奈何不了時間磨礪…… 當(dāng)年年少对供,總覺得還早,一...
    笨熊是一家閱讀 754評論 14 17