Android Service 有三种sticky 机制分别是:START_STICKY、START_NOT_STICKY、START_REDELIVER_INTENT;
1、START_STICKY
class MyStickyService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// 服务被杀死后会尝试重新创建服务
// 新的 Intent 为 null
return START_STICKY
}
}
2、START_NOT_STICKY
class NonStickyService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// 服务被杀死后不会重新创建
return START_NOT_STICKY
}
}
3、START_REDELIVER_INTENT
class RedeliverService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// 服务被杀死后会重新创建
// 并重新传递最后一次的 Intent
return START_REDELIVER_INTENT
}
}
使用场景:
1. START_STICKY:
- 后台音乐播放
- 持续性服务
- 需要一直运行的服务
2. START_NOT_STICKY:
- 定时任务
- 一次性操作
- 非必须服务
3. START_REDELIVER_INTENT:
- 文件下载
- 数据同步
- 需要继续之前任务
注意事项:
- 系统资源紧张时可能无法重启
- Android 8.0 后台限制
- 需要处理 null intent
- 考虑电池优化影响
- 前台服务优先级更高