Service
Service有两种启动方式,第一种是通过调用startService()方法来启动,另一种是调用bindService()方法来启动。
一.通过StartService()启动service
通过startService启动后,service会一直无限运行下去,即使activity销毁了也不会,只有外部调用了stopService()方法或stopSelf()方法时,该Service才会停止运行并销毁。创建这样的service,需要继承service类,然后重写以下方法:
onCreat():
service如果没有被创建过调用startService()方法后会先执行onCreate()方法;service如果已处于运行状态,调用startService()方法不会执行onCreate()方法。总而言之,onCreate()方法只会在第一次创建service的时候调用,多次执行startService()方法不会重复调用startService()。因此onCreate()方法适合处理一些初始化工作。
onStartCommand():
无论startService()方法被调用了多少次,onStartCommand()也相应的被调用相同的次数。可以根据该方法中传入的intent参数进行相应的操作。例如在该方法中创建一个线程用于下载数据或播放音乐。
onBind():
onBind()方法在service中是抽象方法,service类是一个抽象类,所以即使用不到onBind()方法,也必须重写该方法。
onDestory():
在service销毁的时候会执行onDestory()方法。
以上所有的方法都是service的回调方法,并且都是在主线程中执行。
通过startService启动服务时服务的生命周期如下:
二.通过bindService启动service
bindService启动的服务和调用者之间是类似于c/s架构模式。调用者是client端,service是server端。service只有一个,但绑定到service上面的client可以有一个或多个。这里所提到的client指的是组件(比如activity)。
在activity中可以通过Ibinder接口获取service实例,从而实现在activity中直接调用service中的方法来实现交互,用startService()方法启动的service是无法实现的。
bindService启动service的生命周期与其绑定的activity也有关系。当activity被销毁的时候,service也会自动与它解除绑定。在activity中也可以直接调用unBindService()方法与service解除绑定,当没有任何client与service绑定时,service会自动销毁。
通过绑定启动的service的生命周期: