Service 兩種開啓方式的比較

思考:
想使用Service方法,還不想退出的時候關閉Service,該怎麼做呢?

做法:
先通過startService方式開啓服務,然後再綁定,使用結束之後再解綁,然後再停止服務

啓動 Service 有兩種方式

通過startServer() 啓動Service  和  通過bindService() 啓動Service

服務的特性:

1.服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啓動服務;
2.使用startService()方法啓用服務,調用者與服務之間沒有關連,即使調用者退出了,服 務仍然運行。
3.使用bindService()方法啓用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的 特點。

比較:

1. 生命週期:
第一種:通過startServer() 啓動Service  

生命週期:
onCreate()- >onStart()(可多次調用)--服務運行->onDestroy() 

如果Service還沒有運行,則android先調用onCreate(),然後調用onStart();

如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次。 

開啓者調用stopService的時候直接onDestroy,
如果是開啓者自己直接退出而沒有調用stopService的話,Service會一直在後臺運行。
該Service的開啓者再啓動起來後可以通過stopService關閉Service。



第二種:通過bindService() 啓動Service  該方式提供了Context,例如活動等組件調用Sercive內部方法的機制。

生命週期:
onCreate()- >onBind()(只一次,不可多次綁定)   -> onUnbind->onDestroy() 

onBind方法將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。

這個時候把調用者(例如Activity)會和Service綁定在一起,Activity退出了,Srevice就會調用onUnbind->onDestroy相應退出。

2.如果打算採用Context.startService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。
如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。
採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

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


4. startService
* 開始服務,會使進程變成爲服務進程
* 啓動服務的activity和服務不再有一毛錢關係

5. bindService
* 綁定服務不會使進程變成服務進程
* 綁定服務,是activity與服務建立連接,如果activity銷燬了,服務也會被解綁並銷燬,但是如果服務被銷燬,activity不會被銷燬

服務的混合開啓:

* 先start,再bind,銷燬時先unbind,再stop

* 先start,再bind,再stop 沒有反應 ,需要解綁後才能使用該方法。

應用情景:

在退出Activity的時候在後臺播放音樂

一個service可能會處理網絡操作,播放音樂,操作文件I/O.所有這些活動都是在後臺進行。


如一個想要通過service播放音樂,先通過startService() 方法啓動後臺播放音樂的service。然後,也許用戶想要操作播放器開始或暫停,
一個activity就會通過bindService()建立一個到此service的連接,通過onBind()方法的返回值去操作Service類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章