bindService与starService之间的区别:
在程序通过startService()方法启动的服务,会长期在后台运行,并且启动服务的组件与服务之间没有关系,即使启动服务的组件被销毁,服务还是会运行。
但是当一个组件使用bindService的时候,组件会与服务绑定在一起。
关于生命周期:
其中重写onBind方法的时候会返回iBinder接口的对象,所以我们在服务类的时候还要创建一个继承Binder的类(Binder为iBander的父类,iBander不能直接使用,所以用Binder)
服务类:
public class MyService extends Service {
class MyBinder extends Binder{public void callMethodInService(){methodInService();}
}public void methodInService() {Log.i("MyService", "执行服务钟的methodInService()方法");}@Overridepublic void onCreate() {super.onCreate();Log.i("MyService","创建服务");}@Overridepublic boolean onUnbind(Intent intent) {Log.i("MyService","jiebang ");return super.onUnbind(intent);}@Overridepublic IBinder onBind(Intent intent) {Log.i("MyService","绑定服务");return new MyBinder();}
}
关于调用者注意的点就是绑定服务的binService()方法
bindService(Inter servicE,serviceConnection conn,int flags)
通过bindservice调用步骤①在bindservice方法传递的第二个参数,ServiceConnection中onServiceConnected方法,把传进来的lbinder对象保存起来②在service里面创建内部类,继承Blinder对象,在内部类中,暴露出来方法共activity调用③把内部对象,作为onBind方法的返回值,返回去,在activity中可以获取到④通过获取到的service的内部类对象访问相关方法。
调用者类:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private MyService.MyBinder myBinder;private MyConn myConn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init(){Button btn_bind=findViewById(R.id.btn_bind);Button btn_call=findViewById(R.id.btn_call);Button btn_unbind=findViewById(R.id.btn_unbind);btn_bind.setOnClickListener(this);btn_call.setOnClickListener(this);btn_unbind.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_bind:if (myConn==null){myConn=new MyConn();}Intent intent=new Intent(MainActivity.this,MyService.class);bindService(intent,myConn,BIND_AUTO_CREATE);break;case R.id.btn_call:myBinder.callMethodInService();break;case R.id.btn_unbind:if (myConn!=null){unbindService(myConn);myConn=null;}break;}}private class MyConn implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {myBinder=(MyService.MyBinder)service;}@Overridepublic void onServiceDisconnected(ComponentName name) {}}
}
刚开始写博客,写的不好的或者不对的,评论或者留言,谢谢!