作業:https://github.com/fei-ke/MusicPlayer
1、綁定服務
1.1綁定方式
通過服務鏈接(ServiceConnection)或直接獲取Service中狀態和數據信息
服務鏈接能夠獲取Service的對象,因此綁定Service的組件可以調用
Service中的實現的函數
使用Service的組件通過Context.bindService()建立服務鏈接,通過
Context.unbindService()停止服務鏈接
如果在綁定過程中Service沒有啟動,Context.bindService()會自
動啟動Service
同一個Service可以綁定多個服務鏈接,這樣可以同時為多個不同的
組件提供服務
1.2如何綁定service?
step1.新建一個類MyService,繼承Service
step2.在Manifest.xml文件中聲明<service android:name=".MyService"/>
step3.綁定
Intent intent = new Intent(context,MyService.class); ServiceConnection conn = new ServiceConnection(){ public void onServiceDisconnected(ComponentName name) { Log.i("Service", "onServiceDisconnected==="); } public void onServiceConnected(ComponentName name, IBinder service) { Log.i("Service", "onServiceConnected==="); } } context.bindService(intent,conn,Context.BIND_AUTO_CREATE);
調用者通過bindService()函數綁定服務
並在第1個參數中將Intent傳遞給bindService()函數,聲明需要啟動的Service
第3個參數Context.BIND_AUTO_CREATE表明只要綁定存在,就自動建立
Service;同時也告知Android系統,這個Service的重要程度與調用者相同,
除非考慮終止調用者,否則不要關閉這個Service
解除綁定
context.unBindService(conn);
說明:
1. unbindService(conn)//不可以多次調用
2.關於ServiceConnection的兩個方法:
當連接上service時,會調用onServiceConnected方法
當連接上后,service被后台停止,那么此時會調用onServiceDisconnected方法
1.3綁定Service的生命周期
綁定:如果service沒被創建,那么調用一次onCreate(),然后調用onBind(),
多次綁定時,不會多次調用onBind()
解除綁定:調用onUnbind(),然后onDestory().不可以多次調用unbindService()方法解除綁定。
1.4啟動方式和綁定方式的結合
這兩種使用方法並不是完全獨立的,在某些情況下可以混合使用
以MP3播放器為例,在后台的工作的Service通過Context.startSer
vice()啟動某個特定音樂播放,但在播放過程中如果用戶需要暫停
音樂播放,則需要通過Context.bindService()獲取服務鏈接和Serv
ice對象,進而通過調用Service的對象中的函數,暫停音樂播放過
程,並保存相關信息。在這種情況下,如果調用Context.stopServ
ice()並不能夠停止Service,需要在所有的服務鏈接關閉后,Serv
ice才能夠真正的停止
生命周期:
第一次點擊:不管是startService還是bindService,如果service還未存在,那么會調用
onCreate,之后如果是startService那么調用onStartCommand(),如果是
bindService那么會調用onBind()
之后,如果再調startService(),那么會調用onStartCommand();如果再調用
bindService那么如果第一次點擊是bindService,那么就不會調用onBind(),否則
什么方法都不會被調用。
當bindService后,不能stopService,需要通過unBindService()來解除綁定。
只是startService()后,不可以通過unBindService()來銷毀service
service和Activity處於同一個線程。
1.5服務綁定
通過bindService()函數綁定Servcie時, onCreate()函數和onBinde()函
數將先后被調用
通過unbindService()函數取消綁定Servcie時,onUnbind()函數將被調用,
如果onUnbind()函數的返回true,則表示在調用者綁定新服務時,
onRebind()函數將被調用
取消綁定僅需要使用unbindService()方法,並將ServiceConnnection
傳遞給unbindService()方法
需注意的是,unbindService()方法成功后,系統並不會調用
onServiceDisconnected(),因為onServiceDisconnected()僅在意外斷開
綁定時才被調用
1.6Service的原理和用途
startService()的目的是回調onStart()方法,onCreate() 方法是在Service
不存在的時候調用的,如果Service存在(例如之前調用了bindService,那
么Service的onCreate方法已經調用了)那么startService()將跳過onCreate
() 方法。
bindService()目的是回調onBind()方法,它的作用是在Service和調用者之
間建立一個橋梁,並不負責更多的工作(例如一個Service需要連接服務器
的操作),一般使用bindService來綁定到一個現有的Service(即通過
StartService啟動的服務)。