定义一个服务
新增一个MyService的类,并继承自Service,如下:
目前MyService中可以算式空空如也,但是有一个onBind()方法,这个方法是Service中唯一的一个抽象方法,所以必须在子类中实现。既然定义一个服务,自然会去处理一些事情,那么事情的处理应该写在哪里呢?可以重写Service中的一些方法,onCreate(),onStartCommand(),onDestroy()这三个方法,它们是服务中最常用的三个方法。onCreate()是服务创建的时候调用,onStartCommand()方法会在每次服务启动的时候调用,onDestroy()方法会在服务销毁的时候调用。如果服务一启动就立刻执行某个动作,就可以将逻辑写在onStartCommand()方法中,而当服务销毁时,可以在onDestroy()方法中回收那些不再使用的资源。每一个服务都需要在AndroidMainfest.xml中注册才能生效,如下:
这样的 话,一个服务就定义好了。
启动和停止服务
启动和停止服务主要借助Intent来实现,在项目中实践,去启动和停止MyService这个服务,首先,修改activity_main.xml中的代码:
修改MainActivity中的代码,如下:
服务的onCreate()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则是在每次启动服务的时候都会调用。
活动和服务通信
可以在活动中控制服务,这就需要借助服务中的onBind()方法。比如,希望在MyService里提供一个下载的功能,然后活动中可以决定何时开始下载,以及随时查看下载进度。实现这个功能的思路是创建一个专门的Binder对象来对下载功能进行管理,MyService中的代码如下所示:
在DownloadBinder中提供了两个提供下载以及查看下载进度的方法,当让都是模拟方法,并没有实现真正的功能,然后修改activity_main.xml中的代码:
当一个活动和一个服务绑定之后,就可以调用服务里的Binder提供的方法了,修改MainActivity中的代码:
首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceDisconnected()和onServiceConnected()方法,这两个方法分别在活动与服务成功绑定以及解除绑定的时候调用。在onServiceConnected()方法中又通过向下转型得到DownloadBinder的实例,有了这个实例,活动和服务之间的关系就变得十分紧密了。
bindService(bindIntent,connection,BIND_AUTO_CREATE);中的第三个参数表示活动和服务进行绑定之后自动创建服务。