「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」
一、onStartCommand()
我们来看看onStartCommand()方法里面都有什么
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
首先我们可以看到,有1个int类型的返回值,有3个入参,先看一下返回值
1.onStartCommand()返回值
onStartCommand()有三种返回值,分别是START_STICKY、START_NOT_STICKY、START_REDELIVER_INTENT
public static final int START_STICKY = 1;
public static final int START_NOT_STICKY = 2;
public static final int START_REDELIVER_INTENT = 3;
-
START_STICKY
如果返回值为START_STICKY时:当Service被系统强制kill后,Android系统会将该Service依然设置为运行状态,但是不再保存onStartCommand()方法传入的intent对象,一段时间后,系统会尝试重新创建此Service,一旦创建成功将回调onStartCommand方法,但是Intent是null(也就是onStartCommand()方法虽然会执行但是获取不到intent信息),这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似服务
-
START_NOT_STICKY
当Service被系统强制kill后,即使系统内存再次空闲,也不会重新创建此Service。除非应用中再次调用startService启动此Service(这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务)
-
START_REDELIVER_INTENT
当Service被系统强制kill后,会重新创建该Service(会将Service在被杀掉之前最后一次传入onStartCommand方法中的Intent再次保留下来并再次传入到重新创建后的Service的onStartCommand方法中)。适用于主动执行应该立即恢复的作业(例如下载文件)的服务
1.onStartCommand()入参
入参有三个:Intent、flags、startId
- Intent:启动组件传递过来的Intent(可以利用Intent携带参数传递给Service)
- flags: 启动请求的附加参数(START_FLAG_REDELIVERY、START_FLAG_RETRY)
-
START_FLAG_REDELIVERY:
- 返回值为START_STICKY_COMPATIBILITY或者START_STICKY,并且服务被强制杀死时重启后,flags传入START_FLAG_REDELIVERY
- 返回值为START_REDELIVER_INTENT并且服务被强制杀死重启后,flags传入START_FLAG_REDELIVERY
-
START_FLAG_RETRY :服务之前被设为START_STICKY,会被传入这个标记
-
- startId: 当前服务的唯一ID