前台服务问题 - 然后没有调用 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()的主要内容,如果未能解决你的问题,请参考以下文章
mvc 母版页问题 我在网前台用一个母版页 其他页面调用母版页都没有问题