bindService的使用

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) {

        }
    }
}

刚开始写博客,写的不好的或者不对的,评论或者留言,谢谢!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bindService是用于绑定一个服务的方法。通过调用bindService(intent, conn, flags),可以绑定一个服务并获取该服务对象本身。与使用startService(intent)方法只能启动服务不同,bindService可以建立客户端与服务之间的连接。当客户端执行onDestroy销毁时,客户端会自动与服务解除绑定。\[1\] 在代码中,可以通过创建一个ServiceConnection类型的实例来实现与服务的连接。在onServiceConnected方法中,可以获取到服务的实例,并进行相应的操作。当客户端与服务的连接意外丢失时,会调用onServiceDisconnected方法。\[3\] 综上所述,bindService方法可以用于建立客户端与服务之间的连接,并在连接断开时进行相应的处理。 #### 引用[.reference_title] - *1* [Android开发:bindService使用方法](https://blog.csdn.net/daniel80110_1020/article/details/68941598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [AndroidService使用bindService](https://blog.csdn.net/CongPong/article/details/125891481)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值