用于播放音乐的Android服务:为何START_STICKY?

时间:2017-10-04 06:24:24

标签: android android-service

我正在使用Android应用播放音乐。

到目前为止,我已经从负责播放音乐的服务的START_STICKY返回onStartCommand而没有太多考虑因为Eclipse中的工具提示状态:"这种模式对[...]有意义。 。]执行背景音乐播放的服务"。

这个方法所做的第一件事就是在意图中查看它应该做什么(播放,停止,下一首歌......)。

最近,当我在播放音乐时杀死了应用程序(通过在最近的应用程序概述中将其拖出屏幕)应用程序崩溃了。查看日志文件时,我发现在尝试访问onStartCommand中的意图时(在调用应用程序和服务的onCreate方法之后),抛出了NullPointerException。 / p>

因此,我的第一反应是在onStartCommand方法的开头插入:

if (intent == null){
    stopSelf();
    return START_NOT_STICKY;
}

但在再次阅读START_STICKYSTART_NOT_STICKY的说明之后,我想知道:为什么{@ 1}}会被推荐给音乐播放器?

我理解的方式是两者之间的区别在于,如果以START_STICKY启动的服务被终止,它将重新启动(然后使用intent = null)。使用START_STICKY服务将不会重新启动(除非用户请求它),因此它将始终使用intent调用,我不需要检查它是否为null。

当用户杀死应用程序时,我很明显不应重新启动该服务。

另一种情况我可以想到服务可能重新启动的地方是服务是否由于缺乏资源而被系统杀死。在这种情况下,我也不认为用户会希望音乐意外地开始播放音乐,因为有些资源可用。

以下两个答案意味着返回代码没有其他含义,而不是在进程被终止时是否应该重新启动服务:

为什么{1}}推荐用于音乐播放器?

2 个答案:

答案 0 :(得分:1)

const string type - 如果服务由于内存不足而停止,那么在从低内存恢复后,当有足够的内存可用时,将重新创建服务。在这里,您将丢失之前可能计算过的结果。

START_STICKY - 如果服务停止,系统即使有足够的内存也不用费心去重启服务。

此外,当用户杀死应用程序时,服务将不会停止,除非您通过使用某些任务杀手来停止该过程。有关服务的更多信息,请检查此链接。

http://www.vogella.com/tutorials/AndroidServices/article.html

答案 1 :(得分:0)

  

int START_STICKY:   从onStartCommand(Intent,int,int)返回的常量:如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),则将其保持在启动状态但是不要保留这个交付的意图。稍后系统将尝试重新创建服务。因为它处于启动状态,所以它将保证在创建新服务实例后调用onStartCommand(Intent,int,int);如果没有任何挂起的启动命令要传递给服务,它将使用null intent对象调用,因此您必须注意检查这一点。这种模式对于将显式启动和停止运行的事物有意义任意时间段,例如执行背景音乐播放的服务。

所以它是自我放大的,请参考STICKY SERVICE