几年前,当我实现我的小部件时,我在开发网站上的App Widgets页面上使用了这个建议(仍然存在):"如果您的App Widget设置过程可能需要几秒钟(可能在执行Web时)请求)并且您要求您的流程继续,请考虑在onUpdate()方法中启动服务。"我做到了这一点,当它为SDK构建到25时,它就像一个魅力。
它也适用于Android 8.0,但是一旦我以26为目标,应用程序在发出startService调用时就开始在窗口小部件提供程序的onUpdate方法中崩溃。错误消息与尝试从另一个后台服务启动后台服务有关,虽然我在清单中的服务定义中尝试了一些内容但我无法使其工作。
当我确定我并不真的需要从服务更新小部件时,我最终做了一个解决方法,所以现在只需在onUpdate中直接进行更新。服务和背景/前台问题是我没有多少讨论,但我仍然想知道是否有办法继续使用服务来更新小部件。
答案 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()
中调用,以使您的服务成为前台服务