从小部件启动的服务在Oreo中不起作用

gor*_*nwd 3 android widget

几年前,当我实现我的窗口小部件时,我使用了开发站点上的“应用程序窗口小部件”页面(仍然存在)中的以下建议:“如果您的应用窗口小部件设置过程可能需要几秒钟(也许在执行Web请求时),并且您需要您的过程继续进行,请考虑使用onUpdate()方法启动服务。” 我做到了,当为多达25个SDK开发时,它就像一个魅力。

它也可以在Android 8.0上运行,但是当我的目标是26时,该应用在发出startService调用时便开始在小部件提供商的onUpdate方法中崩溃。该错误消息与尝试从另一个后台服务启动后台服务有关,尽管我尝试了清单中服务定义中的一些操作,但无法使它正常工作。

当我确定确实不需要从服务中更新窗口小部件时,我最终做了一个解决方法,因此现在直接在onUpdate中进行更新即可。服务和背景/前景问题我并没有太多困扰,但是我仍然想知道是否有一种方法可以继续使用服务来更新小部件。

Hey*_*lex 5

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

因此,Android O中只有一种方法:

context.startForegroundService(intent)
Run Code Online (Sandbox Code Playgroud)

并在服务中onCreate()做这样的事情:

startForeground(1, new Notification());
Run Code Online (Sandbox Code Playgroud)

更新 据我所知,一些制造商已经在Android N上反向移植了这些新的背景限制,这就是为什么您可以在Android N中得到相同的异常的原因。