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()方法");
}
@Override
public void onCreate() {
super.onCreate();
Log.i("MyService","创建服务");
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("MyService","jiebang ");
return super.onUnbind(intent);
}
@Override
public 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;
@Override
protected 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);
}
@Override
public 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{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder=(MyService.MyBinder)service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
刚开始写博客,写的不好的或者不对的,评论或者留言,谢谢!