服务以毫无意义的方式开始

Service started with dead intent

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

阅读了额外内容
this.searchId = intent.getStringExtra("searchId")

现在,有时应用会崩溃,日志显示这一行是罪魁祸首,传入的 Intent 为空,因此 intent.getStringExtra 抛出 NPE。

问题:intent怎么可能为null?只有我启动过该服务,并且我专门创建了意图。

一个服务可以被系统杀死,无论是出于什么原因,比如电源、内存或者只是为了笑。当它这样做时,系统想知道您是否希望在条件允许它再次 运行 时重新启动您的服务。您描述是否希望重新启动服务以及如何重新启动服务的方式是通过您从 onStartCommand return 获得的值。有四种选择

  • START_STICKY 默认选项(Service 自己的 onStartCommand returns)告诉系统重新启动服务,但不重新传递 Intent用于启动它。这就是导致我的服务以空意图启动的原因。
  • START_STICKY_COMPATIBILITY实际上不知道这是做什么的,文档不清楚
  • START_NON_STICKY 一旦服务因任何原因被终止,系统不应重新启动它,但应用程序本身负责在需要时重新启动。
  • START_REDELIVER_INTENT 告诉系统重新启动服务,并向它发送与最初用于启动它的相同意图。这就是我最终 returning 在我的服务中为了防止 null Intents 问题。现在,如果我的服务由于某种不正常的原因被终止,它会以与最初启动相同的方式重新启动,我的 onStartCommand 看不出有什么不同,一切都很顺利。

如果您不使用开始意图来做一些有用的事情,那么默认的 START_STICKY 也一样好。简直return

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