【问题标题】:Service started from widget doesn't work in Oreo从小部件启动的服务在奥利奥中不起作用
【发布时间】:2018-01-04 21:45:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: android widget


    【解决方案1】:

    在 Android O 中,我们有一个新的背景限制。当你尝试 startService() 时,你会得到 IllegalStateException,所以现在你应该使用 startForegroundService(),但是如果你用这个新方法启动服务,你会得到 RemoteServiceException。为避免此异常,您有 5 秒的时间在 startForegroundService() 之后执行 startForeground(),以通知用户您正在后台工作。

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

    context.startForegroundService(intent)
    

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

    startForeground(1, new Notification());
    

    更新 所以我认为,一些制造商在 Android N 上向后移植了这些新的背景限制,这就是为什么你可以在 Android N 中获得相同的例外。

    【讨论】:

    • 谢谢。这正是正在发生的事情,我没有设法找到解决方案(我不知道 startForegroundService 调用)。
    • 它是否也适用于三星设备?如果设备正在“优化电池”,三星似乎正在杀死后台进程?有什么解决办法吗?参考:dontkillmyapp.com/samsung
    【解决方案2】:

    没有Minimal, Complete, and Verifiable example,很难为您提供帮助。根据你拥有的,你可以拥有:

    • 切换到JobIntentService,特别是如果您的旧服务是IntentService,并且您不介意启动工作可能会延迟几秒钟

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

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

    【讨论】:

    • 对于 JobIntentService,如果设备处于“优化电池”或“电源优化”模式,您如何看待三星杀死后台进程?有什么解决办法吗?参考:dontkillmyapp.com/samsung
    • @agirardello:这不应该是一个直接的问题,因为场景是用户点击应用小部件。这意味着屏幕已打开并且用户正在与设备进行交互。我认为可能这种激进的电源管理的问题正在消除PendingIntents(由“强制停止”式行为提供)。这会影响应用小部件,但使用 JobIntentService 并不是唯一的。
    • 正如您所提到的,点击一个小部件将应用程序带到前台(通过 Activity)并最终触发 JobIntentService,但是在启动时不会发生这种情况(除非您单击当然...)和小部件显示其默认的“加载状态”,因为它们需要服务来计算某些东西(在我的情况下,是倒计时小部件)。我找到了这个stackoverflow.com/questions/63111658/… 并会尝试它是否有效,即使会在短时间内显示烦人的通知;我只是没有找到对我的用例“干净”的用户体验
    • 也许小部件也应该被视为“前景”? O_o
    • 仍然在三星设备和“电池优化”的背景下,我发现了以下内容:AppWidgetProvider。 onUpdate() -> JobIntentService.enqueueWork() -> 不调用 JobIntentService.onHandleWork()。但是,AppWidgetProvider。 onUpdate() -> AlarmManager.setExactAndAllowWhileIdle() -> BroadcastReceiver -> JobIntentService.enqueueWork() -> 调用没有问题 JobIntentService.onHandleWork()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多