與activity之間能傳值的Service

通過startService()和stopService()啟動(dòng)關(guān)閉服務(wù)。適用于服務(wù)和訪問者之間沒有交互的情況。如果服務(wù)和訪問者之間需要方法調(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ù)綁定在一起。 如果訪問者要與服務(wù)進(jìn)行通信,那么,onBind()方法必須返回Ibinder對(duì)象。如果訪問者退出了,系統(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ù)及綁定(也就是說onCreate()和onBind()方法并不會(huì)被多次調(diào)用)。如果訪問者希望與正在綁定的服務(wù)解除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會(huì)導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。

要在activicy中獲取到service中的值,或在activity中調(diào)用service中的方法,必須用bindService來啟動(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ì)象來調(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ì)象的子類,通過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ì)象后,可以通過iStundent來調(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)用一次,無論調(diào)用多少次startService()或bindService()方法,服務(wù)也只被創(chuàng)建一次。

onStart() 只有采用Context.startService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在服務(wù)開始運(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容