一. 前言
1. 定义
服务,是 Android 四大组件之一,属于 计算型组件。
2. 作用
提供需要在后台长期运行的服务,如复杂计算,音乐播放,下载等。
3. 特点
无用户界面,在后台运行,生命周期长。
4. 创建方式
① 在清单文件中自动注册



② 在清单文件中手动注册

还需要自己去清单文件中注册
二. 生命周期
1. 生命周期常用方法

① 四个手动条用的方法
| 手动调用方法 | 作用 |
|---|---|
| startService | 启动服务 |
| stopService | 关闭服务 |
| bindService | 绑定服务 |
| unbindService | 解绑服务 |
② 五个自动调用的方法
| 内部自动调用的方法 | 作用 |
|---|---|
| onCreate | 创建服务 |
| onStartCommand | 开始服务 |
| onDestroy | 销毁服务 |
| onBind | 绑定服务 |
| onUniind | 解绑服务 |
2. 生命周期方法具体介绍
① startService

1> 自动调用的方法:onCreate,onStartCommand
2> 注意:
- 若一个Service被startService多次启动,那么onCreate也只会调用一次。
- 在整个生命周期的方法里,只有onStartCommand可以被多次调用,其它的只能调用一次。
- onStartCommand调用的次数 = startService启动的次数。
- onStartCommand必须返回一个整数,用来描述系统在杀死服务后应该如何继续运行。
3> onStartCommand的返回值
- START_NOT_STICKY:不会重建服务,除非还存在未发送的intent。当服务不再是必须的,并且应用程序能够简单的重启哪些未完成的工作时,这是避免服务运行的最安全的选项。
- START_STICK:重建服务并且调用onStartCommand,但不会再一次传入上一个intent,而是用null intent来调用onStartCommand。除非还有启动服务的intent未发送完,那么这些剩下的intent会继续发送。适用于媒体播放器类似服务,它们不执行命令,但需要一直运行并随时待命。
- START_REDELIVER_INTENT:重建服务并且用上一个已发送过的intent调用onStartCommand。任何未发送完的intent都会依次送入。适用于那些需要立即恢复工作的活跃服务,比如下载文件。
② stopService

1> 自动调用的方法:onDestroy
2> 注意:如果在没有解除绑定的前提下调用,调用stopService是无法停止服务的。
③ bindService

1> 自动调用的方法:onCreate,onBind
④ unbindService

1> 自动调用的方法:onUnbind,onDestroy
3. 常见的生命周期使用
① 启动服务

② 绑定服务

③ 先启动服务,后绑定服务

④ 注意
关于操作Service:
startService,stopService只能开启,关闭Service,但却无法操作Service。
bindService,unbindService除了绑定Service,还能操作Service。
关于Service何时销毁:
startService开启的Service,调用者退出后Service仍然存在。
bindService开启的Service,Service随着调用者退出销毁。
三. 类型
1. 具体分类
① 运行地点:本地服务,远程服务
② 运行类型:前台服务,后台服务
③ 功能:可通信服务,不可通信服务
2. 详细介绍
① 运行地点
| 类别 | 特点 | 优点 | 缺点 | 应用场景 |
|---|---|---|---|---|
| 本地服务 | 运行在主线程;主线程被终止后,服务也会终止 | 节约资源;由于在同一进程因此不需要IPC和AIDL | 限制性很大 | 需要依附某个进程的服务(最常用的服务类型,如音乐播放) |
| 远程服务 | 运行在独立进程;服务常驻在后台,不受其它Activity的影响 | 灵活:服务常驻在后台,不受其它Activity的影响 | 消耗资源;使用IPC和AIDL复杂 | 系统级别服务 |
② 运行类型
| 类别 | 特点 | 应有场景 |
|---|---|---|
| 前台服务 | 在通知栏显示通知(用户可看到) | 服务使用时,需让用户知道并进行相关操作,如音乐播放器。(服务终止时,通知栏的通知也会消失) |
| 后台服务 | 处于后台的服务(用户无法看到) | 服务使用时,不需要让用户知道或进行相关操作,如天气更新,日期同步。(服务终止时,用户无法知道) |
③ 功能
| 类别 | 特点 | 应用场景 |
|---|---|---|
| 不可通信的后台服务 | 用startService启动,调用者退出后Service仍然存在 | Service不与Activity通信 |
| 可通信的后台服务 | 用bindService启动,调用者退出后,随着调用者销毁 | Service需与Activity通信,需要控制服务开始时刻 |
| 可通信的后台服务 | 用startService,bindService启动,调用者退出后,随着调用者销毁 | Service需与Activity通信,不控制服务开始时刻(服务一开始便运行) |
四. 具体使用
五. 其他问题
1. Service和Thread的区别
① 结论:Service和Thread毫无区别
② 解释:之所以有不少人会把它们联系起来,主要因为Service的后台概念。后台:后台任务运行完全不依赖UI,即使Activity被销毁 / 程序被关闭,只要进程还在,后台任务就可继续运行。
③ 异同比较

④ 注意:一般会将 Service 和 Thread联合着用,即在Service中再创建一个子线程(工作线程)去处理耗时操作逻辑。
1 |
|







