1、Service 基本概念
Service 是Android 四大组件之一,可在后台 长期执行任务,而不必提供任何交互界面。但是,Service依赖创建时的应用程序进程,如果该进程被清理,那么Service也会被终止。例如,使用网易云音乐App播放音乐时,应用会创建一个前台Service播放音乐,用户可以通过通知栏消息感知该服务正在运行;此时,即便用户将网易云音乐App置于后台,然后打开微信App聊天,仍然能够畅享音乐;但若用户将网易云音乐App清除,那么音乐播放服务也将被终止
注意:
Service 默认在 主线程 执行任务,需手动 创建子线程
2、Service 常见的应用场景
Service 一般用来 在后台执行耗时,并且不需要直接和用户进行交互 的任务:
-
文件下载:后台执行大文件下载,不影响用户其它操作
-
音乐播放:用户可在使用其他应用时继续听音乐
-
定位服务:实时刷新用户当前的位置,提供地图导航服务等
注意:
运行Service的时候需要关注 电量消耗 问题
使用 前台Service 提高优先级,可降低被系统回收的风险
3、Service 生命周期
Service 提供了以下几个生命周期方法:
-
onCreate:Service 创建时回调一次,这里可进行 初始化 操作;只要Service不被终止,后续调用 startService/bindService 只执行 onStartCommend / onBind 方法
-
onStartCommand:调用 startService 时回调,执行 Service的处理逻辑
-
onBind:调用 bindService 时回调,返回一个Binder实例,通过该实例可以和Service进行交互
-
onUnbind:调用 unbindService 时回调
-
onDestroy:当 Service 被销毁 时回调
示意图如下:
Service创建
|
v
onCreate()
|
+---------+---------+
| |
startService() bindService()
| |
v v
onStartCommand() onBind()
| |
| 客户端交互
| |
stopService() unbindService()
| |
| v
| onUnbind()
| |
+--------+----------+
|
v
onDestroy()
|
v
Service销毁
4、Service 使用流程
Service 的使用方式有两种:
-
通过 startService 启动,stopService / stopSelf 终止
-
通过 bindService 绑定,unbindService 终止
基本步骤大同小异:
Step1. 创建 Service子类
Step2. 在 AndroidManifest.xml 中注册
Step3. 开启 / 终止 Service
注意:
Service的子类 都需要重写onBind,但是使用 startService 启动Service时,这里返回null即可;否则,需返回一个Binder实例
startService:一般重写 onCreate、onStartCommand 和 onDestroy:
onCreate:创建Service的时候调用一次,即第一次调用startService时走一次,后续调用startService时不走,而是重复调用onStartCommand
onStartCommand:放置Service 需处理 的逻辑
onDestroy:销毁 Service
onBind:必须重写,但是使用这种方式启动Service,这里返回null
bindService:一般重写 onCreate、onBind 和 onDestroy;其中,onBind方法需要返回一个Binder实例,该Binder类中放置Service的处理逻辑
无论是哪种方法,Service只会 被创建 / 绑定一次
如果需要和Service进行交互,使用bindService启动Service,因为这里的onBind方法会返回一个IBinder实例,在ServiceConnection的onServiceConnected方法中,可获取该实例和Service进行交互
5、Service 的类型
Service 可分为三种类型:普通Service、前台Service 和 意图Service
其中,startService / bindService 启动的Service 即为普通Service,运行在 主线程
前台Service 是运行在 前台 的Service,通常就是 设备消息栏 中的一条消息,可被用户感知,并且 优先级相对较高,可长时运行
意图Service,即IntentService,会 独立开启子线程 执行任务,并且自动终止,不必手动调用stopService