一. 前言

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通信,不控制服务开始时刻(服务一开始便运行)

四. 具体使用

Service:具体使用

五. 其他问题

1. Service和Thread的区别

① 结论:Service和Thread毫无区别

② 解释:之所以有不少人会把它们联系起来,主要因为Service的后台概念。后台:后台任务运行完全不依赖UI,即使Activity被销毁 / 程序被关闭,只要进程还在,后台任务就可继续运行。

③ 异同比较

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override  
public int onStartCommand(Intent intent, int flags, int startId) {
//新建工作线程
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
}

class MyBinder extends Binder {
public void service_connect_Activity() {
//新建工作线程
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
}

}

2. Service和IntentService的区别

IntentService

参考文章

Android 四大组件:一份全面 & 简洁的 Service 知识讲解攻略