一. 前言
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 |
|