绑定服务调服务方法
Service和Activity通信
上面我們學(xué)習(xí)了Service的基本用法,啟動Service之后,就可以在onCreate()或onStartCommand()方法里去執(zhí)行一些具體的邏輯了。不過這樣的話Service和Activity的關(guān)系并不大,只是Activity通知了Service一下:“你可以啟動了。”然后Service就去忙自己的事情了。那么有沒有什么辦法能讓它們倆的關(guān)聯(lián)更多一些呢?比如說在Activity中可以指定讓Service去執(zhí)行什么任務(wù)。當(dāng)然可以,只需要讓Activity和Service建立關(guān)聯(lián)就好了。
觀察MyService中的代碼,你會發(fā)現(xiàn)一直有一個onBind()方法我們都沒有使用到,這個方法其實就是用于和Activity建立關(guān)聯(lián)的,修改MyService中的代碼,如下所示:
[java]?view plaincopy接下來再修改MainActivity中的代碼,讓MainActivity和MyService之間建立關(guān)聯(lián),代碼如下所示:
[java]?view plaincopy可以看到,這里我們首先創(chuàng)建了一個ServiceConnection的匿名類,在里面重寫了onServiceConnected()方法和onServiceDisconnected()方法,這兩個方法分別會在Activity與Service建立關(guān)聯(lián)和解除關(guān)聯(lián)的時候調(diào)用。在onServiceConnected()方法中,我們又通過向下轉(zhuǎn)型得到了MyBinder的實例,有了這個實例,Activity和Service之間的關(guān)系就變得非常緊密了。現(xiàn)在我們可以在Activity中根據(jù)具體的場景來調(diào)用MyBinder中的任何public方法,即實現(xiàn)了Activity指揮Service干什么Service就去干什么的功能。
當(dāng)然,現(xiàn)在Activity和Service其實還沒關(guān)聯(lián)起來了呢,這個功能是在Bind Service按鈕的點擊事件里完成的。可以看到,這里我們?nèi)匀皇菢?gòu)建出了一個Intent對象,然后調(diào)用bindService()方法將Activity和Service進(jìn)行綁定。bindService()方法接收三個參數(shù),第一個參數(shù)就是剛剛構(gòu)建出的Intent對象,第二個參數(shù)是前面創(chuàng)建出的ServiceConnection的實例,第三個參數(shù)是一個標(biāo)志位,這里傳入BIND_AUTO_CREATE表示在Activity和Service建立關(guān)聯(lián)后自動創(chuàng)建Service,這會使得MyService中的onCreate()方法得到執(zhí)行,但onStartCommand()方法不會執(zhí)行。
?
然后如何我們想解除Activity和Service之間的關(guān)聯(lián)怎么辦呢?調(diào)用一下unbindService()方法就可以了,這也是Unbind Service按鈕的點擊事件里實現(xiàn)的邏輯。
?
轉(zhuǎn)載于:https://www.cnblogs.com/dubo-/p/7708014.html
總結(jié)
- 上一篇: C++11 并发指南五(std::con
- 下一篇: 938. 二叉搜索树的范围和