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 @Override2 public IBinder onBind(Intent arg0) {3 // TODO Auto-generated method stub4 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 @Override10 public void onServiceConnected(ComponentName name, IBinder service) {11 // TODO Auto-generated method stub12 binder=(MyBinder) service; //该binder,需要在activity中声明。13 Log.d("learnservice", "绑定服务conn...");14 }15 };
4.使用 button 的 onClick() 或者 activity 的 onCreat() 等触发 bindService() 方法
1 @Override2 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() 方法绑定并通信。