Android Service 的那些事

不定期记录 Android 中 Service 那些相关的 Tips 。

1. onStartCommand的返回值影响 Service 的生命周期

onStartCommand有4种返回值:

  • START_STICKY:如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int) 方法。如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为 null 。
  • START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统不会自动重启该服务。
  • START_REDELIVER_INTENT:重传 Intent 。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。
  • START_STICKY_COMPATIBILITY:START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。

2. 省事儿的 IntentService

IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class IntentServiceDemo extends IntentService {

public IntentServiceDemo() {
//必须实现父类的构造方法
super("IntentServiceDemo");
}

...

@Override
protected void onHandleIntent(Intent intent) {
//处理耗时任务
}

...

}