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一同销毁,且无法在设置页面看见。