Android Service与Activity之间的通信(bindService启动方式)

步骤:
1.在服务文件中提供Binder 下文中onBind()方法里return的对象
2.在Activity文件中实现ServiceConnection,重写两个回调方法
3.在Activity文件中调用bindService(),传递ServiceConnection
4.系统调用onServiceConnected()的回调方法时,可使用接口定义的方法开始调用服务
5.在Activity文件中断开与服务的连接-------->调用unBindService()

onBind方法是Service与Activity之间建立通信的桥梁(中间人),修改后的Service如下

public class BasisService extends Service {
    @Nullable
    public static final String TAG = "BasisService";
    private BasisBind basisBind;

    @Override
    public void onCreate() {
        Log.d(TAG, "------>onCreate()");
        basisBind = new BasisBind();
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "------>onStartCommand()");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "------>onDestroy()");
        super.onDestroy();

    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "------>onBind()");
        return basisBind;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "------>onUnBind()");
        return super.onUnbind(intent);
    }

    public void show() {
        Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
    }

    public class BasisBind extends Binder {
        public void realize() {
            show();
        }
    }
}

相对于上文Android Service的基本用法添加了一个 onUnbind方法,以及一些操作在这里插入图片描述
下面开始介绍下bindService启动方式
在这里插入图片描述
可以看到其中有三个参数,第二个参数如下

在这里插入图片描述
Java文件如下

public class StartSevice extends AppCompatActivity implements View.OnClickListener {

    private Button btn_start;
    private MyConn conn;
    private BasisService.BasisBind basisBind;
    private Button btn_stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start_sevice);
        conn = new MyConn();
        initView();
    }

    private void initView() {
        btn_start = (Button) findViewById(R.id.btn_start);

        btn_start.setOnClickListener(this);

        btn_stop = (Button) findViewById(R.id.btn_stop);
        btn_stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.btn_start:
                //绑定的方式启动
                Intent bindIntent = new Intent(this, BasisService.class);
                bindService(bindIntent, conn, BIND_AUTO_CREATE);
                break;

            case R.id.btn_stop:
                //建议写在onDestroy()方法中,这里只为显示效果
                unbindService(conn);
                break;
        }

    }

    public void verify() {
        //脱离了service的体系,不能用new对象来调用服务的方法
        BasisService service = new BasisService();
        service.show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除绑定
        unbindService(conn);
    }

    //ServiceConnection 服务连接
    private class MyConn implements ServiceConnection {
        //当服务连接时,如果绑定的服务onBind()没有返回值,则不执行该方法
        //第三个参数iBinder:可以转化成在服务里写的自定义IBinder
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //拿到中间人
            basisBind = (BasisService.BasisBind) iBinder;
            basisBind.realize();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    }

}

下面运行通过看日志了解一下其生命周期
1.绑定服务
在这里插入图片描述
2.多次绑定,没有日志
3.解绑服务在这里插入图片描述
由此可以发现这种启动方式的生命周期与startService启动方式生命周期是不同的

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值