服务始于死意图

时间:2016-06-07 17:17:17

标签: android-service

所以基本上我有一个Service是我的应用程序的本地。它只从代码中的一个地方开始,我在起始意图中发送一个额外的地方。在onStartCommand(Intent, flags, startId)方法中,我读了额外的通过

this.searchId = intent.getStringExtra("searchId")

现在,有时应用程序崩溃,日志显示此行是罪魁祸首,传入的意图为null,因此intent.getStringExtra抛出NPE。

问题:意图如何为空?只有我开始服务,我专门创建了意图。

1 个答案:

答案 0 :(得分:0)

服务可以被系统杀死,无论是电源,内存还是笑声。如果是这样,系统想知道您是否希望在条件允许其再次运行时重新启动服务。如果您希望重新启动服务,以及如何通过onStartCommand返回的值,您的描述方式。有四种选择

  • START_STICKY默认选项(Service自己的onStartCommand返回的选项)告诉系统重新启动服务,但不重新启动用于启动它的Intent。这就是导致我的服务以空意图启动的原因。
  • START_STICKY_COMPATIBILITY实际上并不知道这是做什么的,文档不清楚
  • START_NON_STICKY一旦服务因任何原因被终止,系统不应重新启动它,但应用程序本身负责在需要时重新启动。
  • START_REDELIVER_INTENT告诉系统重新启动服务,并向其发送与首先启动服务相同的意图。这是我最终在我的服务中返回以防止null Intents问题。现在,如果我的服务因某些原因而被杀死,它会以与最初启动相同的方式重新启动,我的onStartCommand没有看到任何区别,一切顺利。

如果你没有使用开始意图来获得有用的东西,那么默认的START_STICKY也同样好。只需返回

return super.onStartCommand(intent, flags, startId);