思考:
想使用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類