作为测试,我从已有的工作服务中删除了“ startForeground(notification)”,并且它似乎仍在工作。
我们是否不需要在Android O及更高版本上发布工作服务的前台通知?
我找不到与此相关的特定文档。
任何参考都是很棒的。
非常感谢您
编辑
对于那些有相同问题的人,我已经在生产中测试了几天。我们的应用程序有一个持续的通知,我一直在从作业服务启动/更新它,而没有调用startForeground,并且在crashlytics中没有发现安全异常。我有信心说:
您不需要为短期任务而从作业服务调用startForeground (例外情况很可能适用于正在进行的任务。我的代码只需进行api调用并更新通知视图)
感谢0X0nosugar和WasabiTea
答案 0 :(得分:2)
为了降低发生这些问题的机会,Android 8.0对用户不能直接使用应用程序时的操作进行了限制 与他们互动。应用有两种限制方式:
后台服务限制:当应用程序处于空闲状态时,其后台服务的使用受到限制。这不适用于 前台服务,使用户更容易注意到。
广播限制:除少数例外,应用程序无法使用其清单来注册隐式广播。他们仍然可以 在运行时注册这些广播,他们可以使用 清单以注册明确针对的广播 他们的应用。
在大多数情况下,应用可以通过使用以下方法来解决这些限制 JobScheduler职位。这种方法可以让应用安排执行工作 当应用未积极运行但仍为系统提供 在不影响用户的情况下安排这些作业的时间 经验。 Android 8.0对JobScheduler进行了多项改进 这样可以更轻松地替换服务和广播接收器 预定的工作;有关更多信息,请参见JobScheduler的改进。
原始文档在这里-https://developer.android.com/about/versions/oreo/background
希望这可以为您提供帮助
答案 1 :(得分:1)
我们是否不需要在Android O及更高版本上发布工作服务的前台通知?
重新阅读了有关Medium(Scheduling jobs like a pro with JobScheduler,JobIntentService for background processing on Android O)的一些帖子以及Android 8.0 Behavior Changes上的文档之后,我得到的印象是您不需要发布前台通知
不必注册为前台parse
也很有意义,尤其是因为您正在使用def parse(self, response):
for event in response.xpath('//ul[contains(@class, "list-recent-events")]/li'):
event_details = dict()
event_details['name'] = event.xpath('h3[@class="event-title"]/a/text()').extract_first()
event_details['location'] = event.xpath('p/span[@class="event-location"]/text()').extract_first()
event_details['time'] = event.xpath('p/time/text()').extract_first()
self.found_events.append(event_details)
yield event_details
做后台工作(这就是为什么您必须实现{{1 }},以便能够随时应对干扰。
不幸的是,我找不到明确的“您不需要前台通知”,因此所有这些都只是间接证据。