Android中onStartCommand返回1报错,需返回指定Service常量如何修复?
解决Service onStartCommand返回值的报错问题
嘿,这个问题我之前开发Android应用时也碰到过!Android对Service的onStartCommand方法返回值有严格要求,不能随便写个整数,必须使用系统预定义的特定常量,你直接返回1系统自然识别不了,所以才抛出这个报错。
为什么会出现这个报错?
Android为onStartCommand定义了四个专用返回常量,每个都对应服务被系统杀死后的不同行为逻辑:
Service.START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,不保证服务被杀死后一定会重启Service.START_STICKY:服务被意外杀死后,系统会尝试重启它,重启后传递的intent会是nullService.START_NOT_STICKY:服务被杀死后不会自动重启,除非有新的intent发送过来Service.START_REDELIVER_INTENT:服务被杀死后会重启,并且会重新传递最后一次收到的intent
你直接返回1,系统无法匹配到任何合法的行为规则,所以提示你必须使用上面这几个值之一。
修复方案
根据你的业务需求选择对应的常量返回即可,下面是修改后的代码示例:
public int onStartCommand(Intent intent, int flags, int startId) { try { player.start(); isRunning = true; } catch(Exception e) { isRunning = false; player.stop(); } // 根据业务需求选择以下其中一个返回值 return Service.START_STICKY; // 不需要自动重启时用:return Service.START_NOT_STICKY; // 需要保证任务续接时用:return Service.START_REDELIVER_INTENT; // 兼容旧版本系统时用:return Service.START_STICKY_COMPATIBILITY; }
额外小提示
- 如果你的服务是执行一次性任务,完成后就可以结束,选
START_NOT_STICKY最合适 - 如果是音乐播放这类需要持续运行的服务,
START_STICKY能保证意外崩溃后自动重启 - 要是有必须完成的任务(比如文件下载),
START_REDELIVER_INTENT可以让服务重启后继续处理之前的任务
内容的提问来源于stack exchange,提问作者Pavel Jan
相关产品推荐
相关产品推荐

