如何在调用startForeground()方法之前停止前台服务?

时间:2019-04-10 11:37:17

标签: android

我正在使用以下代码启动前台服务

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
  } else {
    context.startService(intent);
  }

这将启动前台服务。在Android Oreo及更高版本中,我们必须在5秒内调用startForeground()方法。现在,在我的服务中,我们进行了一些处理,如果不满足某些条件,则不会调用startForeground()方法。相反,我尝试终止该服务。

 if (someConditionMet) {
        startForeground(notificationId, notification)
    } else {
        stopSelf()
 }

现在,如果someConditionMet变量为false,那么我的应用程序将崩溃,并显示以下崩溃日志。

2019-04-10 16:57:25.695 19785-19785/com.awesomedroidapps.foregroundactivity E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.awesomedroidapps.foregroundactivity, PID: 19785
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{e78d43f u0 com.awesomedroidapps.foregroundactivity/.ForegroundServiceTest}
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1835)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6863)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我不明白,当我停止服务时,为什么必须调用startForeground()方法?有什么方法可以在不调用startForeground()方法的情况下停止前台服务?

2 个答案:

答案 0 :(得分:0)

不能。期间。

在调用startForeground并成功执行之前,您不能停止前台服务。必须在完成前台服务中的任何操作之前完成此调用。 无论您使用stopSelf()和stopForeground()的什么组合,它都不会做您想要做的事情。 这是一篇非常不错的文章: Foreground Service Pitfalls

答案 1 :(得分:-1)

尝试以下操作:使用静态变量并跟踪服务的状态(即运行或未运行),然后在调用stopself()之前检查状态。服务启动后,将布尔标志更新为true,服务停止时,将布尔标志更新为false