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

Posted

技术标签:

【中文标题】前台服务问题 - 然后没有调用 Service.startForeground()【英文标题】:Foreground service issue - did not then call Service.startForeground() 【发布时间】:2021-04-10 14:51:17 【问题描述】:

在前台服务中发现了一个有趣的现象,如果我们在启动前台服务后立即停止服务,我们会收到此错误,因为 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() 没有 然后调用 Service.startForeground() 问题。

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

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

【问题讨论】:

【参考方案1】:

启动服务不是同步的,当启动调用返回时,服务没有启动和运行。可以把它想象成向你的主线程循环队列发布一条消息,稍后再处理。

现在您的 Handler 方法也在做同样的事情来推迟执行 - 将一个可运行对象发布到主线程循环队列。它是在队列中的先前消息处理完之后才处理的,因此在调用stopService() 之前,已经执行了一些Service 启动生命周期代码。

【讨论】:

我有兴趣获得一些描述此想法的文档链接。我发现有关显示通知的文档应在 5 秒内完成,但无法获得与此相关的任何内容。实际上如果服务在显示服务前台通知之前就被销毁了,那么android系统根本不应该抛出这个错误。

以上是关于前台服务问题 - 然后没有调用 Service.startForeground()的主要内容,如果未能解决你的问题,请参考以下文章

如何每 5 分钟运行 10 秒的前台服务?

调用前台服务时应用程序崩溃[重复]

mvc 母版页问题 我在网前台用一个母版页 其他页面调用母版页都没有问题

Android 11 - 按下主页按钮时触发前台服务 onTaskRemoved

前台页面 上传预览 调用上传服务

用java做后台用nodejs做前台是啥意思