关于bindService()的使用 学习笔记

1.bindService()方法存在的意义在于

服务当中会有一些自己定义的函数方法(这也是实际开发中常见情况),其中某些方法会需要上下文环境,如Toast 。此时如果你需要在activity中调用服务的这个方法,那么只能实例化这个服务类,获取到对象,然后通过这个对象进行调用,但实例化过程中服务会丢失其上下文环境(丢失的原因可以这么理解:服务的上下文环境来源于其继承的父类Service,Service最终继承自context类,换言之,可以说服务的上下文环境来源于google定义好的框架,而在实例化过程中会脱离这个框架),故会抛出异常,无法执行。
总而言之,bindService()存在的目的在于调用服务里的方法

2.bindService() 绑定服务接收三个参数,参数介绍及实现如下,

public void click1(View v){
        Intent intent = new Intent(this,demoService.class);
        /*
        第一个参数 intent对象,指定当前activity要连接的Service
        第二个参数 ServiceConnection接口的实现 实现其中的两个方法,分别在服务绑定后和解绑后且onBind()方法返回方法不为null时调用
        第三个参数 flags 常量 指定当前服务连接方式,BIND_AUTO_CREATE表示在绑定后如服务没有开启则自动开启服务
         */
        bindService(intent,new myConn(),BIND_AUTO_CREATE);
    }

public class myConn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("onServiceConnected");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("onServiceDisconnected");
        }
    }

//下面这个时demoService.class中的代码
@Override
    public IBinder onBind(Intent intent) {
        System.out.println("bindService");
        return null;
    }

注意:
1.其中关于SerivceConnection接口中两个方法,都必须在demoService.class中的onBind()的返回值不为 null时才可能调用;
2.当执行bindService()方法且启动了服务时,对于服务中的方法(这里就是demoService.class)调用顺序为onCreate()---->onBind()
3.如果当服务与activity处于绑定状态时,activity销毁且未在onDestory方法中解绑服务,则服务也会跟着销毁,且此时会弹出一段类似于错误的红色警告;
4.绑定服务只能进行一次,对同一对服务和activity多次绑定是没有效果的,服务不会对此做出任何响应;
5.服务不能多次进行解绑,多次解绑会引发异常;
6.通过bindService()方法开启的服务不能在手机设置页面找到,相当于一个隐形的服务。

3.关于startSerivce()方式与bindService()两种方式开启服务的不同

startService()方法开启的服务开启后一直在后台运行,除非用户手动停止,且可以通过设置页面看见;
bindService()方法开启的服务如不解绑则会和activity一同销毁,且无法在设置页面看见。

你可能感兴趣的:(Android学习之路)