通過(guò)startService()和stopService()啟動(dòng)關(guān)閉服務(wù)诗眨。適用于服務(wù)和訪問(wèn)者之間沒(méi)有交互的情況。如果服務(wù)和訪問(wèn)者之間需要方法調(diào)用或者傳遞參數(shù)皮服,側(cè)需要使用bindService()和unbindService()方法啟動(dòng)關(guān)閉服務(wù)疹鳄。
采用Context.bindService()方法啟動(dòng)服務(wù)辉川,在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法寒锚,接著調(diào)用onBind()方法劫映,這個(gè)時(shí)候訪問(wèn)者和服務(wù)綁定在一起。 如果訪問(wèn)者要與服務(wù)進(jìn)行通信刹前,那么泳赋,onBind()方法必須返回Ibinder對(duì)象。如果訪問(wèn)者退出了喇喉,系統(tǒng)就會(huì)先調(diào)用服務(wù)的onUnbind()方法祖今,接著調(diào)用onDestroy()方法。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法并不會(huì)被多次調(diào)用)千诬。如果訪問(wèn)者希望與正在綁定的服務(wù)解除綁定撒踪,可以調(diào)用unbindService()方法,調(diào)用該方法也會(huì)導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法大渤。
要在activicy中獲取到service中的值制妄,或在activity中調(diào)用service中的方法,必須用bindService來(lái)啟動(dòng)服務(wù)
1.創(chuàng)建一個(gè)Service
public class StudentService extends Service{
private String[] names = {"張飛","李小龍","趙薇"};
private IBinder binder = new StundentBinder();
public String query(int no){
if(no>0 && no<4){
return names[no - 1];
}
return null;
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
private class StundentBinder extends Binder implements IStundent{
public String queryStudent(int no) {
return query(no);
}
}
}
IStundent借口如下
public interface IStundent {
public String queryStudent(int no);
}
2.在Activity中如果想調(diào)用Service中的queryStudent方法泵三,必須用bindService啟動(dòng)服務(wù)耕捞,拿到IBinder對(duì)象來(lái)調(diào)queryStudent方法在Activity中綁定Service
Intent service = new Intent(this, StudentService.class);
bindService(service, conn, BIND_AUTO_CREATE);
bindService的第一個(gè)參數(shù):用于啟動(dòng)需要綁定服務(wù)的Intent
第二個(gè)參數(shù)為ServiceConnection對(duì)象,需要?jiǎng)?chuàng)建一個(gè)ServiceConnection對(duì)象的子類烫幕,通過(guò)ServiceConnection對(duì)象的子類獲取到服務(wù)的IBinder對(duì)象:
private IStundent iStundent;
private ServiceConnection conn = new StudentServiceConnection();
private class StudentServiceConnection implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder service) {
iStundent = (IStundent)service;
}
public void onServiceDisconnected(ComponentName name) {
iStundent = null;
}
}
第三個(gè)參數(shù)自動(dòng)創(chuàng)建
3.拿到IBinder對(duì)象后俺抽,可以通過(guò)iStundent來(lái)調(diào)用服務(wù)中的方法
private final class ButtonClickListener implements View.OnClickListener{
public void onClick(View v) {
String no = studentno.getText().toString();
String name = iStundent.queryStudent(Integer.valueOf(no));
resultView.setText(name);
}
}
4.解除綁定服務(wù)
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
5.服務(wù)的生命周期
服務(wù)的生命周期跟啟動(dòng)服務(wù)的方法有關(guān):
當(dāng)采用Context.startService()方法啟動(dòng)服務(wù),與之有關(guān)的生命周期方法
onCreate()? onStart() ? onDestroy()
onCreate()該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用较曼,該方法只會(huì)被調(diào)用一次磷斧,無(wú)論調(diào)用多少次startService()或bindService()方法,服務(wù)也只被創(chuàng)建一次捷犹。
onStart() 只有采用Context.startService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法弛饭。該方法在服務(wù)開(kāi)始運(yùn)行時(shí)被調(diào)用。多次調(diào)用startService()方法盡管不會(huì)多次創(chuàng)建服務(wù)萍歉,但onStart() 方法會(huì)被多次調(diào)用侣颂。
onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用。
當(dāng)采用Context.bindService()方法啟動(dòng)服務(wù)枪孩,與之有關(guān)的生命周期方法
onCreate()? onBind() ? onUnbind() ? onDestroy()
onBind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法憔晒。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定蔑舞,多次調(diào)用Context.bindService()方法并不會(huì)導(dǎo)致該方法被多次調(diào)用拒担。
onUnbind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)解除綁定時(shí)被調(diào)用攻询。
如果先采用startService()方法啟動(dòng)服務(wù),然后調(diào)用bindService()方法綁定到服務(wù)从撼,再調(diào)用unbindService()方法解除綁定,最后調(diào)用bindService()方法再次綁定到服務(wù)蜕窿,觸發(fā)的生命周期方法如下:
onCreate()?onStart()?onBind()?onUnbind()[重載后的方法需返回true]?onRebind()