我正在使用以下代码启动前台服务
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()
方法的情况下停止前台服务?
答案 0 :(得分:0)
不能。期间。
在调用startForeground并成功执行之前,您不能停止前台服务。必须在完成前台服务中的任何操作之前完成此调用。 无论您使用stopSelf()和stopForeground()的什么组合,它都不会做您想要做的事情。 这是一篇非常不错的文章: Foreground Service Pitfalls
答案 1 :(得分:-1)
尝试以下操作:使用静态变量并跟踪服务的状态(即运行或未运行),然后在调用stopself()
之前检查状态。服务启动后,将布尔标志更新为true
,服务停止时,将布尔标志更新为false
。