清晰的理解service

1、Service的start和bind狀態有什麼區別?

  • 通過startservice啓動的service擁有獨立的生命週期;調用startservice方法會依次調用onCreate –> onStartCommand方法,多次調用startservice方法會重複調用onStartCommand方法,onCreate 方法只會調用一次;通過startservice啓動的service,必須通過stopService或stopself來停止service;(intentservice【異步服務】會自動調用stopself)

  • 多次調用bind方法,只會調用一次onbind方法,bind方式啓動的service依賴這些組件,該組件銷燬後,service有隨着銷燬

2、同一個Service,先startService,然後再bindService,如何把它停止掉?

  • 不管 startservice 方法調用多少次,只需要stopservice方法調用一次,即可停止service
  • 多次調用bindservice來bind同一個組件,只需要調用一次unbindservice方法,如果是不同的組件,則需要多次onbind
  • 因此,這種情況需要調用一次stopservice方法和unbindservice方法,執行順序沒有要求,最後執行的stopservice或unbindservice方法會導致service的onDestroy執行

3、你有注意到Service的onStartCommand方法的返回值嗎?不同返回值有什麼區別?

返回值有四種:

  • START_NOT_STICKY
    如果系統在onStartCommand()方法返回之後殺死這個服務,那麼直到接受到新的Intent對象,這個服務纔會被重新創建。這是最安全的選項,用來避免在不需要的時候運行你的服務。

  • START_STICKY

如果系統在onStartCommand()返回後殺死了這個服務,系統就會重新創建這個服務並且調用onStartCommand()方法,但是它不會重新傳遞最後的Intent對象,系統會用一個null的Intent對象來調用onStartCommand()方法,在這個情況下,除非有一些被髮送的Intent對象在等待啓動服務。這適用於不執行命令的媒體播放器(或類似的服務),它只是無限期的運行着並等待工作的到來。

  • START_REDELIVER_INTENT

如果系統在onStartCommand()方法返回後,系統就會重新創建了這個服務,並且用發送給這個服務的最後的Intent對象調用了onStartCommand()方法。任意等待中的Intent對象會依次被髮送。這適用於那些應該立即恢復正在執行的工作的服務,如下載文件。

  • START_STICKY_COMPATIBILITY

START_STICKY的兼容版本,但不保證服務被kill後一定能重啓。

4、Service的生命週期方法onCreate、onStart、onBind等運行在哪個線程?

service的生命週期方法都運行在主線程,所以不能在直接service中做耗時操作,service是後臺服務跟thread是有區別的,在service中的做耗時操作需要在service中創建子線程去執行。service的ANR時間是20s

5.service和thread的區別

service是運行在主線程的,做耗時操作會引發ANR;service是指Android的後臺,它的運行時完全不宜懶UI的。即使Activity被銷燬,或者程序被關閉,只要進程還在,Service就可以繼續運行。比如說一些應用程序,始終需要與服務器之間始終保持着心跳連接,就可以使用Service來實現。我們可以在Service中再創建一個子線程,然後在這裏去處理耗時邏輯。

既然在Service裏也要創建一個子線程,那爲什麼不直接在Activity裏創建呢?這是因爲Activity很難對Thread進行控制,當Activity被銷燬之後,就沒有任何其它的辦法可以再重新獲取到之前創建的子線程的實例。而且在一個Activity中創建的子線程,另一個Activity無法對其進行操作。但是Service就不同了,所有的Activity都可以與Service進行關聯,然後可以很方便地操作其中的方法,即使Activity被銷燬了,之後只要重新與Service建立關聯,就又能夠獲取到原有的Service中Binder的實例。因此,使用Service來處理後臺任務,Activity就可以放心地finish,完全不需要擔心無法對後臺任務進行控制的情況。

參考郭霖大神博客和星球夥伴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章