Service 啟動方式有兩種
- startService(intent)
- bindService(intent,conn,Context.BIND_AUTO_CREATE)
startService(intent)
生命周期: onCreate()- >onStartCommand()->startService()->onDestroy()
該方法啟動service,會執行一個onStartCommand()的方法,所以一些操作可以放在 onStartCommand() 中進行處理。
bindService(intent,conn,Context.BIND_AUTO_CREATE)
生命周期:onCreate()->onBind()->onUnbind()->onDestroy()
綁定啟動 service,
使用該方法啟動 service 分為幾步
1.在 Service 中,重寫 onBind() 方法,返回一個 iBinder 對象。
1 @Override 2 public IBinder onBind(Intent arg0) { 3 // TODO Auto-generated method stub 4 Log.d("learnservice", "綁定服務..."); 5 return new MyBinder(); 6 }
2.新建 BinderService 類繼承 Service ,在 BindService 類里新建內部類 MyBinder 繼承Binder ( Binder 實現 IBinder 接口)。該類中實現一些與 service 通信的方法,比如 setData()方法。
1 public class MyBinder extends Binder{ 2 public void setData(String data){ 3 MyService.this.data=data; 4 } 5 }
3.在 Activity 里,實例化 ServiceConnection 接口的實現類,重寫 onServiceConnected() 和 onServiceDisconnected() 方法。
1 ServiceConnection conn=new ServiceConnection() { 2 3 @Override 4 public void onServiceDisconnected(ComponentName name) { 5 // TODO Auto-generated method stub 6 7 } 8 9 @Override 10 public void onServiceConnected(ComponentName name, IBinder service) { 11 // TODO Auto-generated method stub 12 binder=(MyBinder) service; //該binder,需要在activity中聲明。 13 Log.d("learnservice", "綁定服務conn..."); 14 } 15 };
4.使用 button 的 onClick() 或者 activity 的 onCreat() 等觸發 bindService() 方法
1 @Override 2 public void onClick(View v) { 3 intent = new Intent(MainActivity.this,MyService.class); 4 bindService(intent, conn, Context.BIND_AUTO_CREATE);
5 }
5.在 activity 中聲明 service中的binder
1 private MyService.MyBinder binder;
6.同時把該 binder 放在 serviceConnection 的 onServiceConnection() 方法中
1 binder=(MyBinder) service;
這樣,就完成了 Activity 和 Service 通過 bindService() 方法綁定並通信。