Android Service 的生命周期
Service作为Android四大组件之一,主要分为两种,Service和IntentService,启动方式也分为两种,startService和bindService,接下来通过代码来演示这几种之间的区别。
Service 分类
Service
普通的Service,其内部的任务执行还是在主线程中,因此不可以放置耗时任务,除非开辟新线程。
IntentService
自带一个执行任务的线程,需要重写onHandleIntent方法,该方法运行在子线程中,可以执行耗时任务。
onHandleIntent()只有在使用startService()的时候才会调用,如果只是绑定,则相当于把IntentService当普通Service用了。
Service 启动方式
startService
与Activity的关系:通过这种方式启动的服务,与Activity本身没有依存关系,当Activity被finish()的时候,服务仍然存活。
需要停止时:在Activity中调用stopService()来停止。(IntentService会在任务完成后自己死掉)
服务的生命周期:onCreate -> onStartCommand -> onStart(不建议重写) -> onDestroy
多次调用:会多次执行onStartCommand,不会多次执行onCreate。
bindService
与Activity的关系:通过ServiceConnection与Activity建立联系,该服务依存于Activity。当Activity被finish()的时候,必须将服务解绑(即在onDestroy()中unbindService()),否则会出现内存泄漏并报错。
需要停止时:在Activity中调用unbindService()来停止。(bindService的方式启动IntentService没有意义)
服务的生命周期:onCreate -> onBind -> onUnbind -> onDestroy
多次调用:什么也不会发生。
先startService再bindService
与Activity的关系:startService(无关) -> bindService(相关) -> unbindService(无关)。在与Activity相关期间,如果Activity结束,未解绑Service,则会报错。无关期间,activity结束,Service不会结束。
需要停止时:依次调用unbindService()和stopService()进行停止。只调用unbindService()只会unbind,不会停止;只调用stopService()什么都不会发生。
服务的生命周期:onCreate -> onStartCommand -> onBind -> onUnbind -> onDestroy
rebind():在调用了startService的情况下,如果将Service的onUnbind()方法返回值设置为true,对任务解绑再绑定时,就会调用Service中的rebind()方法。(猜测这里onUnbind()返回值的意义是 是否还会有下次绑定)
先bindService再startService
与Activity的关系:bindService(相关) -> startService(相关) -> unbindService(无关)。在与Activity相关期间,如果Activity结束,未解绑Service,则会报错。无关期间,Activity结束,Service不会结束。
需要停止时:依次调用unbindService()和stopService()进行停止。只调用unbindService()只会unbind,不会停止;只调用stopService()什么都不会发生。
服务的生命周期:onCreate -> onBind -> onStartCommand -> onUnbind -> onDestroy
总结
- 绑定对应onBind(),解绑对应onUnbind(),启动对应onStartCommand()
- 绑定服务要比启动服务更加牢固。(未解绑前,stopService()无用)
- Activity结束前必须解绑之前绑定的Service
- 绑定服务的意义是与被绑定Activity通信。
Service 保证存活
- 开两个服务互相唤醒启动
- 监听系统广播启动
- 设置服务优先级
- 设置为前台服务。(重写onStartCommand,加一句startForeground(),重写onDestroy(),加一句stopForeground())