我們做幾個(gè)實(shí)驗(yàn):
1,啟動(dòng)service后,按back鍵返回。
一開(kāi)始我沒(méi)在service中用子線程來(lái)調(diào)用方法,結(jié)果導(dǎo)致點(diǎn)擊屏幕沒(méi)有響應(yīng),但是菜單按鈕和會(huì)主界面的
按鈕可以按,因?yàn)椋?code>service還是運(yùn)行在主線程中的,后面我用子線程調(diào)用方法,測(cè)試的結(jié)果是:
用startService()啟動(dòng)之后,按back鍵,activity被destroy,但是service繼續(xù)在運(yùn)行,也就是說(shuō),當(dāng)
activity被銷毀后,主線程并沒(méi)有被銷毀,并且程序運(yùn)行完后,service也沒(méi)有destroy。而用bindService()
啟動(dòng)之后,按back鍵,activity被銷毀,然后onUnbindService,然后ServiceDestroy,但是程序還是一直
運(yùn)行,也就是說(shuō)bindService和activity是綁定的,當(dāng)activity消亡時(shí),這個(gè)service也消亡。同時(shí)這里得提一下,
當(dāng)這個(gè)service消亡時(shí),是只運(yùn)行service中的onUnbind()方法,不會(huì)去運(yùn)行activity中的onServiceDisconnected()
方法。
2,分別多次按startService按鈕和BoundService按鈕,看看情況
結(jié)果是startService按鈕是第一次創(chuàng)建service后,后面每次按都不會(huì)再創(chuàng)建,但是都會(huì)執(zhí)行onStartCommand()方法,
而對(duì)于bindService而言,按一次之后再按不會(huì)有變化,但是如果將conn這個(gè)變量在BoundService按鈕的
方法體中再次賦值(之前是在onCreate中賦值),那么結(jié)果就不同,當(dāng)按下一次后再按,結(jié)果就會(huì)再次執(zhí)行,再按,再執(zhí)行,
當(dāng)然如果你調(diào)用的方法的執(zhí)行需要時(shí)間,比如打印1-100的數(shù),那么兩次結(jié)果會(huì)穿插輸出,而當(dāng)你按unBound按鈕時(shí),就會(huì)發(fā)現(xiàn)
當(dāng)你按一次時(shí),它不會(huì)調(diào)用service中的onUnbind()方法,service也不會(huì)被destroy,但是再按一次就會(huì)報(bào)錯(cuò),內(nèi)容大概是
service沒(méi)有registered(發(fā)生這種情況的原因是這里的conn會(huì)跟最后一個(gè)按BoundService按鈕時(shí)候生成的conn一致。)。這與按一次BoundService按鈕,再按一次unBoundService按鈕結(jié)果不
同,這時(shí)按unBoundService的結(jié)果是會(huì)調(diào)用service中的onUnbind()方法,service也會(huì)被destroy。為什么多按幾次BoundButton再按一次unBoundButton不會(huì)調(diào)用service中的onUnbind()方法,
service也不會(huì)被destroy呢?但是這個(gè)service應(yīng)該是被unBind的了的,不然的話第二次按的話為什么會(huì)出現(xiàn)這個(gè)service沒(méi)有registered的錯(cuò)誤呢,那么如何被onunBind的呢?而后,我想到
將所產(chǎn)生的conn全部存儲(chǔ)起來(lái),然后分別當(dāng)作參數(shù)傳遞給activity中的unbindService(conn)方法,
于是我將點(diǎn)擊bindButton按鈕產(chǎn)生的所有ServiceConnection的對(duì)象全都存儲(chǔ)到一個(gè)
ServiceConnnection的數(shù)組中,然后在unBindButton中將數(shù)組的值分別賦值給conn,這樣的話當(dāng)你點(diǎn)擊bindButton
產(chǎn)生多個(gè)ServiceConnection對(duì)象后,點(diǎn)擊unBindButton按鈕就會(huì)依次解除綁定,當(dāng)你解除最后一個(gè)service時(shí),就會(huì)調(diào)用
onUnbind和destroy方法,也就是說(shuō),其實(shí)onUnbind方法是等所有的service解除綁定后才調(diào)用,所以之前只解除一個(gè)service
時(shí)并沒(méi)有調(diào)用這個(gè)方法,也就沒(méi)有destroy,因?yàn)檫@個(gè)service和activity還是處在綁定的狀態(tài)。
startService與BindService的區(qū)別
最后編輯于 :
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Android執(zhí)行Service有兩種方法,一種是startService,一種是bindService。下面讓我...
- Android執(zhí)行Service有兩種方法,一種是startService,一種是bindService。下面讓我...
- 轉(zhuǎn)自Android四大基本組件介紹與生命周期Android四大基本組件分別是Activity,Service服務(wù),...
- Service是Android四大組件中與Activity最相似的組件,他們都代表可執(zhí)行的程序,Service與A...
- 回想一下,好像自從可以自己進(jìn)行財(cái)務(wù)支配開(kāi)始,就走上了不斷交“智商稅”的道路。大學(xué)前是典型的學(xué)霸,心思都在學(xué)習(xí)上面,...