通过 ContextCompat.startForegroundService() 启动服务后应用程序立即崩溃

App crashing right away after starting service via ContextCompat.startForegroundService()

我的应用目前仍以 SDK 25 为目标 我正在尝试替换我的后台服务以便能够以 SDK 26 为目标。 为此,我现在使用

启动我的 IntentService
ContextCompat.startForegroundService()

如果我正确理解了文档,我将有 5 秒的时间在服务上调用 startForeground()。

这样做时效果很好。 但有时我的服务没有任何工作要做,所以它立即退出(onHandleIntent() 没有做任何事情),但应用程序崩溃并出现以下错误

AndroidRuntime: FATAL EXCEPTION: 
Process: com.myAPPPackage, PID: 3855
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

在那种情况下延迟 5 秒怎么办? 我可以看到在调用 ContextCompat.startForegroundService()

几毫秒后调用了服务 onDestroy() 方法

知道为什么应用会这样崩溃吗?

Any idea why the app is crashing like that?

您没有打电话给 startForeground()

But sometimes my service doesn't have any work to do, so it just exits right away

您需要先致电startForeground()

或者让调用 startForegroundService() 的任何东西在调用 startForegroundService() 之前先确定是否有任何工作要做。这样,如果不需要前台服务,您就不必费心调用 startForegroundService()

If I understand the documentation correctly I then have 5 seconds to call startForeground() on the service.

是的,但这并不意味着您可以跳过调用startForeground()。您必须 呼叫startForeground()。你只有五秒钟的时间来这样做。我的猜测是,这是为了避免滥用 startForegroundService().