startService 和 bindService的區別

一.Service的簡介

1.Service介紹和作用
Service是Android系統中的四大組件之一,它是一種長生命週期的,沒有可視化界面,運行於後臺的一種服務程序。比如我們播放音樂的時候,有可能想邊聽音樂邊幹些其他事情,當退出播放音樂的應用,如果不用Service,我 們就聽不到歌了,所以這時候就得用到Service了。
 
2.Service生命週期
Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當第一次啓動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這裏需要注意的是,如果Service已經啓動了,當我們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。
 
二.Service的啓動方式
Service的有兩種啓動方式:Context.startService()和Context.bindService(),這兩種方式對Service生命週期的影響是不同的。
 
1.Context.startService()方式啓動
 
①Context.startService()方式的生命週期:
啓動時,startService –> onCreate() –> onStart()
停止時,stopService –> onDestroy()
如果調用者直接退出而沒有停止Service,則Service 會一直在後臺運行
 
Context.startService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
 
2.Context.bindService()方式啓動:
 
Context.bindService()方式的生命週期:
綁定時,bindService -> onCreate() –> onBind()
調用者退出了,即解綁定時,Srevice就會unbindService –>onUnbind() –> onDestory()
 
用Context.bindService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。
 
②Context.bindService()方式啓動 Service的方法:
綁定Service需要三個參數:bindService(intent, conn, Service.BIND_AUTO_CREATE);
第一個:Intent對象
第二個:ServiceConnection對象,創建該對象要實現它的onServiceConnected()和 onServiceDisconnected()來判斷連接成功或者是斷開連接
第三個:如何創建Service,一般指定綁定的時候自動創建
 
三.startService 和 bindService的區別
 
服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法都可以啓動Service,但是它們的使用場合有所不同。
 
使用startService()方法啓用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。使用bindService()方法啓用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。
 
如果打算採用Context.startService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務但會導致多次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
 

如果打算採用Context.bindService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。

發佈了32 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章