startService與BindService的區(qū)別

我們做幾個實驗:
1,啟動service后,按back鍵返回。
一開始我沒在service中用子線程來調用方法,結果導致點擊屏幕沒有響應,但是菜單按鈕和會主界面的
按鈕可以按,因為,service還是運行在主線程中的,后面我用子線程調用方法,測試的結果是:
startService()啟動之后,按back鍵,activity被destroy,但是service繼續(xù)在運行,也就是說,當
activity被銷毀后,主線程并沒有被銷毀,并且程序運行完后,service也沒有destroy。而用bindService()
啟動之后,按back鍵,activity被銷毀,然后onUnbindService,然后ServiceDestroy,但是程序還是一直
運行,也就是說bindService和activity是綁定的,當activity消亡時,這個service也消亡。同時這里得提一下,
當這個service消亡時,是只運行service中的onUnbind()方法,不會去運行activity中的onServiceDisconnected()
方法。
2,分別多次按startService按鈕和BoundService按鈕,看看情況
結果是startService按鈕是第一次創(chuàng)建service后,后面每次按都不會再創(chuàng)建,但是都會執(zhí)行onStartCommand()方法,
而對于bindService而言,按一次之后再按不會有變化,但是如果將conn這個變量在BoundService按鈕的
方法體中再次賦值(之前是在onCreate中賦值),那么結果就不同,當按下一次后再按,結果就會再次執(zhí)行,再按,再執(zhí)行,
當然如果你調用的方法的執(zhí)行需要時間,比如打印1-100的數,那么兩次結果會穿插輸出,而當你按unBound按鈕時,就會發(fā)現
當你按一次時,它不會調用service中的onUnbind()方法,service也不會被destroy,但是再按一次就會報錯,內容大概是
service沒有registered(發(fā)生這種情況的原因是這里的conn會跟最后一個按BoundService按鈕時候生成的conn一致。)。這與按一次BoundService按鈕,再按一次unBoundService按鈕結果不
同,這時按unBoundService的結果是會調用service中的onUnbind()方法,service也會被destroy。為什么多按幾次BoundButton再按一次unBoundButton不會調用service中的onUnbind()方法,
service也不會被destroy呢?但是這個service應該是被unBind的了的,不然的話第二次按的話為什么會出現這個service沒有registered的錯誤呢,那么如何被onunBind的呢?而后,我想到
將所產生的conn全部存儲起來,然后分別當作參數傳遞給activity中的unbindService(conn)方法,
于是我將點擊bindButton按鈕產生的所有ServiceConnection的對象全都存儲到一個
ServiceConnnection的數組中,然后在unBindButton中將數組的值分別賦值給conn,這樣的話當你點擊bindButton
產生多個ServiceConnection對象后,點擊unBindButton按鈕就會依次解除綁定,當你解除最后一個service時,就會調用
onUnbinddestroy方法,也就是說,其實onUnbind方法是等所有的service解除綁定后才調用,所以之前只解除一個service
時并沒有調用這個方法,也就沒有destroy,因為這個serviceactivity還是處在綁定的狀態(tài)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容