Android中startService和bindService的區(qū)別

Service屬于android四大組件之一贾惦,在很多地方經(jīng)常被用到。開啟Service有兩種不同的方式:startService和bindService。不同的開啟方式潮售,Service執(zhí)行的生命周期方法也不同。
首先锅风,先看一下Service都有哪些生命周期方法酥诽。
要想使用Service需要寫一個自己的MyService類,并繼承Service皱埠。還要在清單文件中聲明一下肮帐。

<service android:name=".MyService"/>
public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("call", "onBind");
        return null;
    }

    @Override
    public void onCreate() {
        Log.e("call", "onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("call", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.e("call", "onDestroy");
        super.onDestroy();
    }
}

startService開啟服務(wù)和結(jié)束服務(wù)稍微簡單一點(diǎn)。

//開啟服務(wù)
Intent service = new Intent(this, MyService.class);
startService(service);
//結(jié)束服務(wù)
stopService(service);

開啟服務(wù)時边器,調(diào)用一次startService泪姨,生命周期執(zhí)行的方法依次是:
onCreate() ==> onStartCommand();
調(diào)用多次startService,onCreate只有第一次會被執(zhí)行饰抒,而onStartCommand會執(zhí)行多次肮砾。
結(jié)束服務(wù)時,調(diào)用stopService袋坑,生命周期執(zhí)行onDestroy方法仗处,并且多次調(diào)用stopService時,onDestroy只有第一次會被執(zhí)行枣宫。

bindService開啟服務(wù)就多了一些內(nèi)容婆誓。

//開啟服務(wù)
Intent service = new Intent(this, MyService.class);
MyConnection conn = new MyConnection();
//第一個參數(shù):Intent意圖
//第二個參數(shù):是一個接口,通過這個接口接收服務(wù)開啟或者停止的消息也颤,并且這個參數(shù)不能為null
//第三個參數(shù):開啟服務(wù)時的操作洋幻,BIND_AUTO_CREATE代表自動創(chuàng)建service
bindService(service, conn, BIND_AUTO_CREATE);

bindService的方法參數(shù)需要一個ServiceConnection接口的實現(xiàn)類對象,我們自己寫一個MyConnection類翅娶,并實現(xiàn)里面的方法文留。

private class MyConnection implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //只有當(dāng)我們自己寫的MyService的onBind方法返回值不為null時好唯,才會被調(diào)用
            Log.e("call","onServiceConnected");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //這個方法只有出現(xiàn)異常時才會調(diào)用,服務(wù)器正常退出不會調(diào)用燥翅。
            Log.e("call","onServiceDisconnected");
        }
    }
//結(jié)束服務(wù)
unbindService(conn);

bingService開啟服務(wù)時骑篙,根據(jù)生命周期里onBind方法的返回值是否為空,有兩種情況森书。
1靶端、onBind返回值是null;
調(diào)用bindService開啟服務(wù),生命周期執(zhí)行的方法依次是:
onCreate() ==> onBind();
調(diào)用多次bindService凛膏,onCreate和onBind也只在第一次會被執(zhí)行杨名。
調(diào)用unbindService結(jié)束服務(wù),生命周期執(zhí)行onDestroy方法猖毫,并且unbindService方法只能調(diào)用一次台谍,多次調(diào)用應(yīng)用會拋出異常。使用時也要注意調(diào)用unbindService一定要確保服務(wù)已經(jīng)開啟鄙麦,否則應(yīng)用會拋出異常典唇。
2、onBind返回值不為null胯府;
看一下android對于onBind方法的返回類型IBinder的介紹介衔,字面上理解是IBinder是android提供的進(jìn)程間和跨進(jìn)程調(diào)用機(jī)制的接口。而且返回的對象不要直接實現(xiàn)這個接口骂因,應(yīng)該繼承Binder這個類炎咖。
那么我們就在自己寫的MyService里創(chuàng)建一個內(nèi)部類MyBinder,讓他繼承Binder寒波,并在onBind方法里返回MyBinder的對象乘盼。

@Override
public IBinder onBind(Intent intent) {
    Log.e("call", "onBind");
    MyBinder mbind = new MyBinder();
    Log.e("call", mbind.toString());
    return mbind;
}
private class MyBinder extends Binder{
    public void systemOut(){
        System.out.println("該方法在MyService的內(nèi)部類MyBinder中");
    }
}

這時候調(diào)用bindService開啟服務(wù),生命周期執(zhí)行的方法依次是:
onCreate() ==> onBind() ==> onServiceConnected();
可以發(fā)現(xiàn)我們自己寫的MyConnection類里的onServiceConnected方法被調(diào)用了俄烁。調(diào)用多次bindService绸栅,onCreate和onBind都只在第一次會被執(zhí)行,onServiceConnected會執(zhí)行多次页屠。
并且我們注意到onServiceConnected方法的第二個參數(shù)也是IBinder類型的粹胯,不難猜測onBind()方法返回的對象被傳遞到了這里。打印一下兩個對象的地址可以證明猜測是正確的辰企。
也就是說我們可以在onServiceConnected方法里拿到了MyService服務(wù)的內(nèi)部類MyBinder的對象风纠,通過這個內(nèi)部類對象,只要強(qiáng)轉(zhuǎn)一下牢贸,我們可以調(diào)用這個內(nèi)部類的非私有成員對象和方法竹观。
調(diào)用unbindService結(jié)束服務(wù)和上面相同,unbindService只能調(diào)用一次宾濒,onDestroy也只執(zhí)行一次泥从,多次調(diào)用會拋出異常瞪讼。
接下來我們說一下startService和bindService開啟服務(wù)時温技,他們與activity之間的關(guān)系。
1水由、startService開啟服務(wù)以后,與activity就沒有關(guān)聯(lián),不受影響芍锚,獨(dú)立運(yùn)行。
2蔓榄、bindService開啟服務(wù)以后并炮,與activity存在關(guān)聯(lián),退出activity時必須調(diào)用unbindService方法甥郑,否則會報ServiceConnection泄漏的錯誤逃魄。

最后還有一點(diǎn),同一個服務(wù)可以用兩種方式一同開啟澜搅,沒有先后順序的要求伍俘,MyService的onCreate只會執(zhí)行一次。
關(guān)閉服務(wù)需要stopService和unbindService都被調(diào)用勉躺,也沒有先后順序的影響癌瘾,MyService的onDestroy也只執(zhí)行一次。但是如果只用一種方式關(guān)閉服務(wù)饵溅,不論是哪種關(guān)閉方式妨退,onDestroy都不會被執(zhí)行,服務(wù)也不會被關(guān)閉蜕企。這一點(diǎn)需要注意咬荷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市轻掩,隨后出現(xiàn)的幾起案子幸乒,更是在濱河造成了極大的恐慌,老刑警劉巖唇牧,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罕扎,死亡現(xiàn)場離奇詭異,居然都是意外死亡奋构,警方通過查閱死者的電腦和手機(jī)壳影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弥臼,“玉大人宴咧,你說我怎么就攤上這事【睹澹” “怎么了掺栅?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵烙肺,是天一觀的道長。 經(jīng)常有香客問我氧卧,道長桃笙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任沙绝,我火速辦了婚禮搏明,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闪檬。我一直安慰自己星著,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布粗悯。 她就那樣靜靜地躺著虚循,像睡著了一般。 火紅的嫁衣襯著肌膚如雪样傍。 梳的紋絲不亂的頭發(fā)上横缔,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音衫哥,去河邊找鬼茎刚。 笑死,一個胖子當(dāng)著我的面吹牛炕檩,可吹牛的內(nèi)容都是我干的斗蒋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼笛质,長吁一口氣:“原來是場噩夢啊……” “哼泉沾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妇押,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤跷究,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后敲霍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊马,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年肩杈,在試婚紗的時候發(fā)現(xiàn)自己被綠了柴我。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡扩然,死狀恐怖艘儒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤界睁,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布觉增,位于F島的核電站,受9級特大地震影響翻斟,放射性物質(zhì)發(fā)生泄漏逾礁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一访惜、第九天 我趴在偏房一處隱蔽的房頂上張望嘹履。 院中可真熱鬧,春花似錦疾牲、人聲如沸植捎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚓峦,卻和暖如春舌剂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暑椰。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工霍转, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人一汽。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓避消,卻偏偏與公主長得像,于是被迫代替她去往敵國和親召夹。 傳聞我的和親對象是個殘疾皇子岩喷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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

  • 版權(quán)聲明:本文為博主原創(chuàng)文章纱意,未經(jīng)博主允許不得轉(zhuǎn)載 PS:轉(zhuǎn)載請注明出處作者: TigerChain地址: htt...
    TigerChain閱讀 741評論 0 3
  • Jianwei's blog 首頁 分類 關(guān)于 歸檔 標(biāo)簽 巧用Android多進(jìn)程,微信鲸阔,微博等主流App都在用...
    justCode_閱讀 5,900評論 1 23
  • 參考: 服務(wù)|Android Developers 一. 什么是服務(wù) 服務(wù)是一個可以在后臺執(zhí)行長時間運(yùn)行操作而不提...
    NickelFox閱讀 541評論 0 3
  • 我記得那個日子偷霉,五月三十日。 那是我兼職的第一天褐筛,公司說类少,讓我一周來三到五天,具體幾天渔扎,看事情的多少硫狞。其實我是希望...
    饅頭愛豆包閱讀 206評論 0 0
  • 一對父母妓忍,孩子們都大了虏两,自己想做年輕時沒做過的,回到鄉(xiāng)下世剖,種花種菜定罢,養(yǎng)雞養(yǎng)鴨,起初旁瘫,孩子們不同意祖凫,說生活終于安定了...
    花花草草的字閱讀 353評論 0 0