Android bindService开启服务

一、bindService开启服务

   1.第一次点击按钮,会执行服务的onCreate方法和onBind方法

   2.当onBind方法返回为null 的时候,onServiceConnected方法是不执行的

   3.第二次点击按钮,服务没有响应

   4.调用者(Activity)销毁,服务跟着一起销毁

   5.服务不可以多次解绑,多次解绑会报异常

   6.通过bind方式开启服务,服务不能在设置页面找到,相当于是一个隐形的服务

1.绑定服务

//点击按钮 绑定服务,开启服务的第二种方式
public void click3(View v){
    Intent intent = new Intent(this,DemoService.class);
    /*第一个参数,链接到DemoService这个服务
    *第二个参数ServiceConnection
    * 第三个参数,自动创建服务
    * */
    conn = new MyConn();
    bindService(intent,conn,BIND_AUTO_CREATE);
}
//定义一个类,用来监视服务的状态
private class MyConn implements ServiceConnection{
    //当服务链接成功调用
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        System.out.println("连接成功");
    }
    //失去连接调用
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        System.out.println("失去连接");
    }
}
@Override
protected void onDestroy() {
    //挡Activity销毁的时候,要解绑服务
    unbindService(conn);
    super.onDestroy();
}

2.解绑服务

//点击按钮,手动解绑服务
public void click4(View v){
    unbindService(conn);
}

二、为什么要引入binService

1.目的,为了调用服务里面的方法

2.步骤(办证案例为例)

      【1】在服务内部定义一个方法,让Activity去调用

//办证的方法
public void banZheng(int money){
    if(money>1000){
        Toast.makeText(getApplicationContext(),"我是领导,把证给你办了",Toast.LENGTH_SHORT).shwo();
    }else{
        Toast.makeText(getApplicationContext(),"这点钱还想办事。。。",Toast.LENGTH_SHORT).shwo();
    }
}

      【2】在服务内部定义一个中间人对象(IBinder)

public class MyBinder extends Binder{

    public void callBanZheng(int money){

        //调用方法
        banZheng(money);

    }
}

      【3】把定义的中间人对象(IBinder)在onBind方法里面返回

public IBinder onBind(Intent intent) {
    return new MyBinder;
}

      【4】在MainActivity的onCreate方法里面调用 bindservice ,目的是为了获取我们定义的中间人对象(IBinder)

Intent intent = new Intent(this,BanZhengService.class);
//连接服务
conn = new MyConn();
bindService(intent,conn,BIND_AUTO_CREATE);

      【5】获取中间人对象(IBinder)

//监视服务的状态
private class MyConn implements ServiceConnection{

    //当服务链接成功是调用
    @Override
    public void onServiceConnected(ComponentName name;IBinder sevice){
        //获取中间人对象(IBinder)
        myBinder = (MyBinder)service;
    }
    //失去连接
    @Override
    public void onServiceDisconnected(ComponentName name){
        
    }

}

      【6】拿到了中间人对象(IBinder)就可以间接地调用到服务里面的方法

      【7】当Activity销毁的时候解绑服务

public void click(View v){

    myBinder.callBanZheng(10);

}

三、通过接口方式调用服务里面的方法

      接口可以隐藏代码内部的细节,让程序员暴露自己只想暴露的方法

1.定义一个接口,把想暴露的方法都定义在接口里面

2.我们定义的中间人对象(IBinder)实现我们自己定义的接口

3.在获取中间人对象(IBinder)的时候,获取的是一个接口类型

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值