谨以文章记录学习历程,如有错误还请指明。
前言
记得我的第一部手机是Nokia的,当时的Symbian系统相较于其他手机最突出的一点就是,Symbian系统支持后台功能,毕竟这使得我们可以一边听着音乐一边聊着qq,在当时这可是很酷的一件事,毕竟Symbian系统出现以前,只能用一部mp3听音乐,另外再拿一部手机打电话。
Android显然看到了这个发光点,自始至终就支持后台功能,IOS随着时间的推移也发现这个功能的重要性,在后续版本加入了后台功能。
本文就将针对这一炫酷的后台功能(Service
)开始讲解,深入总结Service
的方方面面的知识。
简介
- 服务(
Service
) 是Android实现程序后台运行的解决方案,是Android四大组件之一。 - 适合于执行不需要和用户交互而且需要长期运行的任务。
生命周期
首先放上Google官方文档给出的生命周期示意图:
(单独使用startService()
和单独使用bindService()
时的生命周期)
回调方法介绍
回调方法 | 说明 |
---|---|
onCreate() | 首次创建服务时调用,执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已在运行,则不会调用此方法。 |
onStartCommand() | 当另一个组件(如 Activity )通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。) |
onDestroy() | 当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。 |
onBind() | 当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC )时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null 。 |
onUnbind() | 解绑服务 |
特别事项
onCreate()
只调1次startService()
调用次数=onStartCommand()
调用次数。Service
通过bindService()
被绑定启动后,将一直运行,直到调用unBindService()
或者调用bindService()
的Context
被销毁(即 使用bindService()
建立的连接断开)。尽管
Context
销毁时,Service
会自动停止,但只要调用bindService()
进行绑定,仍然还是需要在某处调用unBindService()
解除绑定onStartCommand()
方法必须返回一个整数,描述系统在杀死服务后如何继续运行。START_NOT_STICKY:
不会重新创建服务,除非有未发送的intent
。当应用程序可以简单地重新启动任何未完成的工作时,这是避免在不必要的情况下运行服务的最安全的选项。START_STICKY
重新创建服务并调用onStartCommand()
,但不会再次送入上一个intent
。相反除非有未发送完的启动服务的intent
,否则使将用null intent
调用onStartCommand()
。这适用于不执行命令的媒体播放器(或类似的服务),但它们会持续运行并随时待命。- START_REDELIVER_INTENT
重新创建服务并调用onStartCommand()
,并将上一个intent
交付给服务。任何未处理的intent
都将依次传递。这适用于需要立即恢复工作的活跃服务,例如下载文件。
手机屏幕旋转时,Activity会销毁 & 重新创建,因此使用
bindService()
建立的连接会断开
startService()与bindService()混合使用时的生命周期:
我们给出两个例子:
startService()
->bindService()
或者bindService()
->startService()
,这二者顺序仅仅影响onBind()
和onStartCommand()
的顺序- 多次重复
startService()
或bindService()
也同样遵循上述 特别事项
按顺序1,2,3,4执行
(1)startService()
:调用onCreate()
->onStartCommand()
(2)bindService()
:调用onBind()
(3)stopService()
:没有调用onDestory()
,Service
仍然在运行!
(4)unbindService()
:调用onUnbind()
->onDestory()
,此时Service关闭!官方解释:
若被停止的服务依然有ServiceConnection
与其绑定,则服务不能销毁,直至我们把所有ServiceConnection
解绑将上述3,4调换
(1)startService()
:调用onCreate()
->onStartCommand()
(2)bindService()
:调用onBind()
(3)unbindService()
:调用onUnbind()
,Service
仍然在运行!
(4)stopService()
:调用onDestory()
,此时Service关闭!官方解释:
当所有ServiceConnection
解绑后,系统会自动销毁服务(不包括同时用startService()
启动的情况)。此时,我们不得不再调用一次stopService()
来销毁它
给出Google官方的图,方便直观的理解: