从小部件开始的服务在Oreo中不起作用

时间:2018-01-04 21:45:28

标签: android widget

几年前,当我实现我的小部件时,我在开发网站上的App Widgets页面上使用了这个建议(仍然存在):"如果您的App Widget设置过程可能需要几秒钟(可能在执行Web时)请求)并且您要求您的流程继续,请考虑在onUpdate()方法中启动服务。"我做到了这一点,当它为SDK构建到25时,它就像一个魅力。

它也适用于Android 8.0,但是一旦我以26为目标,应用程序在发出startService调用时就开始在窗口小部件提供程序的onUpdate方法中崩溃。错误消息与尝试从另一个后台服务启动后台服务有关,虽然我在清单中的服务定义中尝试了一些内容但我无法使其工作。

当我确定我并不真的需要从服务更新小部件时,我最终做了一个解决方法,所以现在只需在onUpdate中直接进行更新。服务和背景/前台问题是我没有多少讨论,但我仍然想知道是否有办法继续使用服务来更新小部件。

2 个答案:

答案 0 :(得分:4)

在Android O中,我们有新的背景限制。当您尝试startService()时,您将获得IlleagalStateException,所以现在您应该使用startForegroundService(),但是如果您通过这个新方法启动服务,您将获得RemoteServiceException。要避免此异常,您需要5秒钟在startForegroundService()之后创建startForeground(),以通知用户您在后台工作。

那么,Android O中只有一种方式:

password = ''.join([random.choise(chars) for _ in range(length)])

在服务onCreate()中做类似的事情:

context.startForegroundService(intent)

<强>更新 因此,我认为,一些制造商在Android N上支持这些新的背景限制,这就是为什么你可以在Android N中获得同样的例外。

答案 1 :(得分:1)

没有Minimal, Complete, and Verifiable example,很难帮助你。根据你拥有的东西,你可以:

  • 切换到JobIntentService,特别是如果您的旧服务是IntentService,并且您不介意在开始工作中延迟几秒钟的可能性

  • startForegroundService()(而不是Context)上调用startService()来启动您的服务,并在您的服务电话startForeground()中,让您的服务成为前景服务

  • getForegroundService()上调用PendingIntent(而不是getService()),并在服务电话startForeground()中调用,以使您的服务成为前台服务