提问者:小点点

前台服务问题-没有调用Service.startForeground()


对于前台服务,我发现了一个有趣的现象,如果我们在启动前台服务后立即停止服务,我们会得到这个错误,因为Context.startForegroundService()没有调用Service.startForeground()。不管我们是从onCreate还是onStartCommand服务开始通知。

Intent intent = new Intent(this, MyService.class)
startForegroundService(intent);
stopService(intent);

但是如果我增加一个延迟,那么它会像预期的那样工作,对此有什么想法吗?

Intent intent = new Intent(this, MyService.class)
startForegroundService(intent);
new Handler(Looper.getMainLooper()).postDelayed(() -> stopService(intent), 0);

为了摆脱这个错误,这就是我修复的方式。

我在开发人员网站上找不到任何合适的文档,但这是我为了解决Context.startForegroundService()问题而做的。

如果我们想停止前台服务,请不要使用 stopService(intent) 在服务类之外调用,而是创建一个 intent 动作,启动前台服务,然后使用 stopSelf 从服务 onStartCommand 停止服务。

Intent serviceIntent = new Intent(context, MyService.class);
serviceIntent.setAction(ACTION_STOP_SERVICE);
ContextCompat.startForegroundService(context, serviceIntent);

共1个答案

匿名用户

启动服务不是同步的,并且在启动调用返回时服务未启动并运行。可以将其视为将消息发布到您的主线程 looper 队列,稍后会进行处理。

现在,您的Handler方法也在做同样的事情来推迟执行-向主线程循环器队列发布一个可运行的消息。它在队列中的前一条消息被处理后被处理,因此在调用stopService()之前,有一些Service启动生命周期代码被执行。