我正在开发一款用于播放音乐的安卓应用。
目前,我从负责播放音乐的服务的onStartCommand
方法中返回了START_STICKY
,但并没有考虑太多。因为在Eclipse的提示工具中指出:“对于执行后台音乐播放的服务,此模式是有意义的”。
该方法的第一件事是查看意图(play、stop、下一首歌曲等)。
最近,当我在播放音乐时关闭应用程序(通过在最近使用的应用程序概览中将其拖出屏幕)时,应用程序崩溃了。查看日志文件后,我发现在调用应用程序和服务的onCreate
方法之后,在onStartCommand
中访问意向时抛出了空指针异常。
因此,我的第一反应是在onStartCommand
方法的开头插入以下代码:
if (intent == null){
stopSelf();
return START_NOT_STICKY;
}
但是我再次阅读
START_STICKY
和START_NOT_STICKY
的描述后,我想知道:为什么会建议音乐播放器使用START_STICKY
?我的理解是,两者之间的区别在于,如果使用
START_STICKY
启动的服务被杀死,它将重新启动(然后带有intent=null)。使用START_NOT_STICKY
时,除非用户请求,否则该服务将不会重新启动,因此它将始终被调用,并且我不需要检查它是否为null。当用户关闭应用程序时,我认为服务不应该重新启动。
我能想到的另一种情况是,如果由于资源不足而导致系统杀死了服务。即使某些资源变得可用,用户也不希望出现意外开始播放音乐的情况。
以下两个答案暗示返回代码除了确定服务是否应该在进程被杀死后重新启动之外,没有其他含义:
- What is START_STICKY,START_NOT_STICKY and START_REDELIVER_INTENT Service
- START_STICKY and START_NOT_STICKY
START_STICKY
?