Service-02

可跳過

現(xiàn)在是4-8號(hào)凌晨,坐在廣州火車站旁邊的麥當(dāng)勞里面,和三個(gè)小偷+一個(gè)主動(dòng)跟小偷嘮嗑的傻妹子。前幾天請(qǐng)假回學(xué)校去答辯,以為8號(hào)要上班,買了七號(hào)晚上回來的機(jī)票,可惜到廣州的時(shí)候沒有車到惠州的,得在廣州站等到8號(hào)早上4點(diǎn)坐火車去惠州。昨天晚上坐在去廣州火車站的大巴車上吧,沿途看著陌生的街道和行人,有種不可描述的開心,像小魚游進(jìn)了更大的魚塘。我喜歡這里,可能是因?yàn)檫@里看起來充滿了機(jī)會(huì),也可能是因?yàn)榻?jīng)常被叫作“靚仔”。坐在這里好困,又不敢睡覺,萬一三個(gè)小偷趁我睡著了把我拐走怎么辦,困得不行的時(shí)候想到不如寫簡書吧,那就開始寫吧!

Service的綁定和啟動(dòng)有什么區(qū)別?

好像跳過了什么內(nèi)容,應(yīng)該先說怎么啟動(dòng)或者綁定一個(gè)Service吧?

啟動(dòng)一個(gè)Service

通過Context的startService(intent)方法便可以開啟Service,這樣一來只要是Context的子類或擁有Context引用的對(duì)象都可以開啟Service了,上回說到Service的生命周期,這里通過startService開啟Service之后會(huì)回調(diào)...(略),啟動(dòng)一個(gè)Service之后,這個(gè)Service可以說跟啟動(dòng)它的對(duì)象都沒關(guān)系了,各玩各的,即便是啟動(dòng)它的對(duì)象都沒了(比如Activity都finish掉了),啟動(dòng)的Service里面開的線程還在那兒玩,通過在onStartCommand里面開線程打印內(nèi)容就能看到這個(gè)現(xiàn)象。

綁定Service

上面啟動(dòng)Service會(huì)看到各玩各的情況,但是如果我們使用綁定Service的方式,就可以獲得一個(gè)與Service通信的通道,這個(gè)通道可能是簡單的Binder子類,也可能是使用AIDL描述過的一個(gè)接口,AIDL涉及到跨進(jìn)程通信,后面再看,我們先來說簡單的Binder子類吧。Binder是實(shí)現(xiàn)了IBinder接口的類,我們寫一個(gè)類繼承Binder的話不需要實(shí)現(xiàn)任何方法,只需要寫自己需要的方法,然后onBind方法返回自己寫的類的對(duì)象就行了,比如這樣寫:

    public class  MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }

    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return new MyBinder();
    }

這樣一來,我們只要獲得返回的這個(gè)MyBinder的對(duì)象就能獲得當(dāng)前的MyService對(duì)象,就能使用它的方法了。那這個(gè)MyBinder對(duì)象返回到哪里去了呢?到這里來了:

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.MyBinder  myBinder = (MyService.MyBinder) service;
            Log.d(TAG, "onServiceConnected: " + myBinder.getService().func());
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisconnected: ");
        }
    };

    private void bind() {
        this.bindService(new Intent(this, MyService.class), mServiceConnection, BIND_AUTO_CREATE);
    }

我們?cè)谑褂胋indService方法來綁定一個(gè)Service的時(shí)候,第二個(gè)參數(shù)是一個(gè)ServiceConnection的實(shí)體類。第三個(gè)參數(shù)是設(shè)置在綁定成功的時(shí)候創(chuàng)建Service對(duì)象,這里主要說ServiceConnection。我們自己寫了一個(gè)ServiceConnection的實(shí)現(xiàn)類,其中需要重寫兩個(gè)方法,onServiceConnected和onServiceDisconnected,其中:

  • onServiceConnected(ComponentName name, IBinder service)
    第一個(gè)參數(shù)是綁定的Service的包名,第二個(gè)參數(shù)就是Service里面的onBind方法返回的MyBinder對(duì)象,我們?cè)诜椒w里面把這個(gè)IBinder對(duì)象向下轉(zhuǎn)型為MyBinder對(duì)象就可以調(diào)用里面的getService方法獲得啟動(dòng)的MyService對(duì)象啦
  • onServiceDisconnected(ComponentName name)
    這個(gè)方法是啟動(dòng)的Service還在,但是啟動(dòng)這個(gè)Service的組件掛掉了被迫斷開連接的時(shí)候回調(diào),比如啟動(dòng)Service的這個(gè)組件的進(jìn)程被銷毀的時(shí)候。

二者區(qū)別

好了,把上面兩種說出來之后兩者的區(qū)別也出來了,通過startService啟動(dòng)Service之后不能調(diào)用到Service里面的方法,但是bindService就可以通過獲得一個(gè)Binder對(duì)象,即與Service通信的通道。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容