Service及相關(guān)知識(shí)點(diǎn)總結(jié)

說(shuō)在前面的話(huà)

    Service是Android程序里面最常用的基礎(chǔ)組件之一,它是一個(gè)可以在后臺(tái)長(zhǎng)期運(yùn)行的組件,用戶(hù)不能直接
與之交互烁挟,但可以通過(guò)別的應(yīng)用組件綁定服務(wù)與之交互,service使用需要在manifest中進(jìn)行配置铸史。
    1. service默認(rèn)運(yùn)行在主線(xiàn)程中,處理耗時(shí)的邏輯一樣回導(dǎo)致ANR。
    2. service創(chuàng)建的目的是Activity不可見(jiàn)或者銷(xiāo)毀的情況下仍能執(zhí)行邏輯蜈七。
    3. 一個(gè)service無(wú)論new多少次只能有一個(gè)實(shí)例
    4. 可以和一個(gè)已經(jīng)調(diào)用startService而被開(kāi)啟的service進(jìn)行綁定,這種情況下stopService或stopSelf
并不能停止service(除非所有的客戶(hù)都解除綁定)

1.Service的兩種啟動(dòng)方式及生命周期

1).StartedService(生命周期onCreate->onStartCommand->running->onDestroy)

  • 啟動(dòng)
    通過(guò)startServce方法啟動(dòng)service婿脸,如果不調(diào)用stopService或者stopSelf停止服務(wù)則可以無(wú)限的運(yùn)行下去(即使啟動(dòng)service的組建被銷(xiāo)毀也不影響)粱胜,第一次啟動(dòng)會(huì)調(diào)用onCreate和onStartCommand方法,多次啟動(dòng)不再調(diào)用onCreate方法只調(diào)用onStartCommand方法狐树,并且傳入的startId不同焙压。
  • 停止
    通過(guò)stopService方法停止service,如果service沒(méi)啟動(dòng)則沒(méi)有什么效果抑钟;如果service已經(jīng)通過(guò)startService啟動(dòng)涯曲,并且沒(méi)有綁定其他客戶(hù)則會(huì)停止service并且調(diào)用onDestroy方法。在service類(lèi)內(nèi)可以調(diào)用stopSelf方法停止service在塔。

2).BoundService(生命周期onCreate->onBind->running->onUnbind->onDestroy)

  • 啟動(dòng)
    通過(guò)bindService方法啟動(dòng)service幻件,會(huì)將service與啟動(dòng)的組件進(jìn)行綁定,生命周期受啟動(dòng)組件什么周期影響蛔溃,不會(huì)無(wú)限運(yùn)行绰沥,啟動(dòng)組件可以通過(guò)IBinder接口和service進(jìn)行通信。首次啟動(dòng)會(huì)調(diào)用onCreate和onBind方法贺待,并且會(huì)調(diào)用ServiceConnection里的onServiceConnected方法(如果onBind返回null則不會(huì)調(diào)用)徽曲,多次綁定不會(huì)多次調(diào)用onBind方法只得到IBinder對(duì)象(同一個(gè)),當(dāng)最后一個(gè)綁定調(diào)用unBind方法解除綁定才會(huì)銷(xiāo)毀
  • 停止
    通過(guò)unbindService方法解綁service狠持,如果沒(méi)有bindService(即使startService啟動(dòng)過(guò))會(huì)報(bào)錯(cuò)崩潰疟位;如果已經(jīng)bindService則會(huì)停止service并調(diào)用onUnbind和onDestroy方法

ServiceConnection中onServiceDisconnected方法會(huì)在與服務(wù)的連接意外中斷時(shí)(例如當(dāng)服務(wù)崩潰或被終止時(shí))調(diào)用該方法。當(dāng)客戶(hù)端取消綁定時(shí)喘垂,系統(tǒng)不會(huì)調(diào)用該方法甜刻。

stopSelf(int startId)與stopSelf()的區(qū)別:stopSelf()直接停止;stopSelf(startId)在其參數(shù)startId跟最后啟動(dòng)該service時(shí)生成的startId相等時(shí)才會(huì)執(zhí)行停止服務(wù)正勒。startId即是調(diào)用onStartCommand時(shí)傳入的參數(shù)得院。

2.startService和bindService組合使用時(shí)的生命周期

    service有兩種狀態(tài),一種是“已啟動(dòng)”章贞,一種是“已綁定”祥绞,當(dāng)且僅當(dāng)service沒(méi)有任何狀態(tài)時(shí)才會(huì)銷(xiāo)毀
  • start->bind->running->stop->unbind(先start后bind,然后先stop再u(mài)nbind)

1.start:會(huì)調(diào)用onCreate和onStartCommand方法鸭限;
2.bind:因?yàn)閟ervice已經(jīng)啟動(dòng)所以只會(huì)調(diào)用onBind方法蜕径;
3.stop:因?yàn)閟ervice還別的有客戶(hù)端bind,所以還有個(gè)“已綁定”狀態(tài)败京,所以不會(huì)被銷(xiāo)毀兜喻,所以不會(huì)執(zhí)行onDestroy方法;
4.unbind:此時(shí)已經(jīng)沒(méi)有任何狀態(tài)了赡麦,所以會(huì)被銷(xiāo)毀朴皆,會(huì)調(diào)用onUnbind和onDestroy方法帕识。

  • start->bind->running->unbind->stop(先start后bind,然后先unbind再stop)

1.start:會(huì)調(diào)用onCreate和onStartCommand方法遂铡;
2.bind:因?yàn)閟ervice已經(jīng)啟動(dòng)所以只會(huì)調(diào)用onBind方法肮疗;
3.unbind:因?yàn)閟ervice是別的客戶(hù)端通過(guò)start啟動(dòng)的,所以還有個(gè)“已啟動(dòng)”狀態(tài)扒接,所以不會(huì)被銷(xiāo)毀伪货,所以只執(zhí)行onUnbind方法;
4.stop:此時(shí)已經(jīng)沒(méi)有任何狀態(tài)了珠增,所以會(huì)被銷(xiāo)毀超歌,調(diào)用onDestroy方法。

  • bind->start->running->stop->unbind(先bind后start蒂教,然后先stop再u(mài)nbind)

1.bind:會(huì)調(diào)用onCreate和onBind方法巍举;
2.start:因?yàn)閟ervice已啟動(dòng),所以只會(huì)調(diào)用onStartCommand方法凝垛;
3.stop:因?yàn)閟ervice是別的客戶(hù)端通過(guò)bind啟動(dòng)的懊悯,所以還有個(gè)“已綁定”的狀態(tài),所以不會(huì)被銷(xiāo)毀梦皮,所以不會(huì)執(zhí)行onDestroy方法炭分;
4.unbind:此時(shí)已經(jīng)沒(méi)有任何狀態(tài)了,所以會(huì)被銷(xiāo)毀剑肯,會(huì)調(diào)用onUnbind和onDestroy方法捧毛。

  • **bind->start->running->unbind->stop(先bind后start,然后先unbind后stop) **

1.bind:會(huì)調(diào)用onCreate和onBind方法让网;
2.start:因?yàn)閟ervice已啟動(dòng)呀忧,所以只會(huì)調(diào)用onStartCommand方法;
3.unbind:因?yàn)閟ervice還有別的客戶(hù)端調(diào)用過(guò)startService方法溃睹,所以還有個(gè)“已啟動(dòng)”的狀態(tài)而账,所以不會(huì)被銷(xiāo)毀,所以只會(huì)執(zhí)行onUnbind方法因篇。
4.stop:此時(shí)已經(jīng)沒(méi)有任何狀態(tài)了泞辐,所以會(huì)被銷(xiāo)毀,會(huì)調(diào)用onDestroy方法竞滓;

3.Foreground Service(前臺(tái)服務(wù))

    前臺(tái)service并不是運(yùn)行在前臺(tái)咐吼,它也是運(yùn)行在后臺(tái),它只是在service開(kāi)啟時(shí)通過(guò)使用通知(常駐通知欄商佑,
只有service停止或者通stopForeground來(lái)移除)來(lái)告訴人們它正在運(yùn)行锯茄,例如音樂(lè)播放器通過(guò)前臺(tái)服務(wù)來(lái)顯示
當(dāng)前播放的曲目、進(jìn)度條等莉御,這里只介紹簡(jiǎn)單的使用方法撇吞,具體使用方法在后面的RemoteView中再做介紹。
public class MyService extends Service {  

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }  

    @Override
    public void onCreate() {
        super.onCreate();
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MyService.class), 0);
        Notification notification = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setWhen(System.currentTimeMillis())
                .setContentTitle("我是標(biāo)題")
                .setContentText("正在運(yùn)行")
                .setContentIntent(contentIntent)
                .build();
        startForeground(1, notification);
    }  

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopForeground(true);
    }

}

通過(guò)startForeground方法開(kāi)啟礁叔,通過(guò)stopForeground停止牍颈,使用比較簡(jiǎn)單不再贅述了。

4.IntentService

本部分內(nèi)容見(jiàn)Android線(xiàn)程—IntentService的使用及原理

5.IPC-Messenger和AIDL的原理及使用(后續(xù)更新)

6.總結(jié)(后續(xù)更新)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琅关,一起剝皮案震驚了整個(gè)濱河市煮岁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涣易,老刑警劉巖画机,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異新症,居然都是意外死亡步氏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)徒爹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荚醒,“玉大人,你說(shuō)我怎么就攤上這事隆嗅〗绺螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵胖喳,是天一觀(guān)的道長(zhǎng)泡躯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)丽焊,這世上最難降的妖魔是什么较剃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮粹懒,結(jié)果婚禮上重付,老公的妹妹穿的比我還像新娘。我一直安慰自己凫乖,他們只是感情好确垫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著帽芽,像睡著了一般删掀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导街,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天披泪,我揣著相機(jī)與錄音,去河邊找鬼搬瑰。 笑死款票,一個(gè)胖子當(dāng)著我的面吹牛控硼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艾少,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卡乾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缚够?” 一聲冷哼從身側(cè)響起幔妨,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谍椅,沒(méi)想到半個(gè)月后误堡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雏吭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年锁施,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思恐。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沾谜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胀莹,到底是詐尸還是另有隱情基跑,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布描焰,位于F島的核電站媳否,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荆秦。R本人自食惡果不足惜篱竭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望步绸。 院中可真熱鬧掺逼,春花似錦、人聲如沸瓤介。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刑桑。三九已至氯质,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祠斧,已是汗流浹背闻察。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辕漂。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓呢灶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钉嘹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子填抬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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