Service作為四大元件之一,也有其生命周期,在前面的執行個體中我們使用到了onCreate(),onStartCommand(),onBind(),及onDestroy()等方法,這些方法并不是全部都會進行回調執行,一般的有以下兩種情況:
1.在項目的某位置調用了startService()方法,相應的服務的onCreate()就會啟動執行,接着回調onStartCommand()方法,直到服務執行完畢調用stopService()方法,回調onDestroy()方法,服務才停止
2.在項目的某位置調用了bindService()方法,相應服務的onBind()方法會被回調執行,如果該服務沒被建立過,onCreate()方法也會被執行,執行onBind()後調用方會擷取IBinder對象的執行個體,這樣服務和活動之間就可以保持通信了。
前面的應用執行個體一和二對第一種情況有了很好的說明,下面的應用執行個體三主要是實作第二種情況的例子:
1.建立mainActivity
public class MainActivity extends Activity implements OnClickListener{
Button bindService;
Button unBindService;
MyService.DownLoadBinder mBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService = (Button)findViewById(R.id.BindService);
unBindService = (Button)findViewById(R.id.unBindService);
bindService.setOnClickListener(this);
unBindService.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//點選bindservice按鈕後,建立intent對象,執行bindService()方法,傳入第一個參數為可啟動MyService的意圖
//傳入的第二個參數為建立的和服務建立連接配接通訊的serviceConnection對象connection
//傳入的第三個參數為一個标志位,表示自動建立服務
//點選unbindservice按鈕後,調用unbindservice()方法停止通訊連接配接,即可停止服務
switch (arg0.getId()) {
case R.id.BindService:
Intent intent = new Intent(this, MyService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
break;
case R.id.unBindService:
unbindService(connection);
default:
break;
}
}
//建立和服務建立通訊連接配接的匿名serviceconnection對象
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
//當建立和服務的通訊連接配接後,回調函數onBind傳回mBinder後,啟動onserviceconnection方法,通過mBinder自用啟動調用服務中的方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mBinder = (MyService.DownLoadBinder)service;
mBinder.startDownLoad();
mBinder.getProgress();
}
};
}
二.建立MyService
public class MyService extends Service {
DownLoadBinder mBinder= new DownLoadBinder();
public MyService() {
}
//在 使用方法bindService()的時候,調用onBind之前會先調用onCreate()方法
public void onCreate(){
super.onCreate();
Log.d("MyService","onCreate executed");
}
//建立DownloadBinder類繼承Binder類,當執行完onBind後調用方擷取mBinder執行個體,
//該執行個體對象可自由調用該類中的Startdownload或者getProgress等方法
class DownLoadBinder extends Binder{
public void startDownLoad(){
Log.d("MyService", "startDownload execuuted");
}
public void getProgress(){
Log.d("MyService", "getProgress executed");
}
}
@Override
//開始bindService()方法後,回調onBind,擷取的mBinder傳回調用方,此後調用方可通過mBinder對服務進行随時的指令通訊
public IBinder onBind(Intent intent) {
return mBinder;
// TODO: Return the communication channel to the service.
}
//啟動unbindservice()方法後回調onDestroy()方法,停止服務
public void onDestroy(){
super.onDestroy();
Log.d("MyService", "onDestroy executed");
}
}
三.在manifest中對服務進行注冊
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" >
</service>
運作程式,列印的log結果如下: