其实在上面已经多次提到启动服务了,其实启动/关闭service非常简单,两个api搞定:
ntent用于指定我们要开启的服务,可以用显示意图也可以用隐式意图。显式意图很简单,直接指明开启的服务的类名即可,像这样:
如果使用隐式意图,首先我们需要在配置service时增加一个意图过滤器:
然后我们开启服务的时候,也指定action:
关闭服务同理,此处不再敖述。
这个比启动/关闭service稍微复杂点,关键是理解流程,api都是很简单的。下面先从api开始介绍:
bindService方法接收三个参数:
Intent service:指定要绑定的服务,跟startService的参数相同,不再介绍。
int flags:绑定选项,这个参数指定绑定的一些选项,常用的有BIND_AUTO_CREATE(这个参数很吊,当调用bindService时,如果没有开启服务,将会自动开启服务),BIND_DEBUG_UNBIND等
ServiceConnection conn:服务连接器.这个对象用于和service进行通信,之前我们在创建service时有个必须实现的方法叫onBind,这个方法返回的IBinder对象将会被此连接器获取,进而此连接器通过调用IBinder的方法与service交互。
这是一个接口类型,我们可以看看接口声明:
此接口有两个方法,从名字就可以看出来,一个是在与服务建立连接的时候调用,另一个是与服务失去连接的时候调用。其中onServiceConnected方法的第二个参数就是之前onBind返回的IBinder的引用!所以onBind方法如果返回null此处就获取不到IBinder引用了。我们将在后面介绍activity与service进行交互,具体使用示例请继续往下看。
unbindService方法接收的参数也是这个连接器,需要注意的是两个连接器必须是同一个,故我们通常将连接器设为全局的变量。另外还有一个需要注意的点,服务只能被解除绑定一次,如果第二次解除绑定,将会抛出异常。但是为了确保service解绑,通常会在activity的onDestroy中解绑service,为了不抛异常,我们有两种解决方案。一是定义一个标志位,表示当前是否已经解除绑定,这样只要判断标志位即可。另外一种方案是将unbindService方法try起来:
在文章一开始我们介绍srvice分类的时候就已经说了前台service,故这里不再介绍前台service,咱们直接创建一个前台service。创建前台service需要调用一个api叫startForeground(),但是这个方法是在2.0之后才有的,在之前的版本,我们使用setForeground()方法。文档里面有如何兼容旧版本的demo程序,用到了反射。在这里为了方便起见,直接使用新版api了:
首先新建一个android工程,然后创建一个类继承service:
可以看到,我们在onCreate方法中创建了一个通知,然后调用startForefround方法使当前service以前台方式运行,在onDestroy方法中停止前台服务,并销毁通知。
然后别忘了在清单文件中配置:
最后,我们编写一个activity,添加两个按钮分别用于启动/停止服务,代码很简单,下面只贴出onclick方法: