【发布时间】:2017-09-12 14:36:44
【问题描述】:
假设我有一个应用程序的小部件,它的 targetSDKVersion 设置为 26。这个小部件需要 100 毫秒到 10 秒才能更新。大部分时间都在 1s 以内。在 Android O 之前,如果在我的 AppWidgetProvider 上调用 onUpdate(),我可以启动一个后台服务来更新这个小部件。但是,如果您尝试该行为,Android O 会返回 IllegalStateException。启动前台服务的显而易见的解决方案似乎是一种极端措施,因为它可以在 99% 的时间内在 10 秒内完成。
可能的解决方案
- 启动前台服务以更新小部件。用 10 秒后就会消失的通知来惹恼用户。
- 使用 JobScheduler 尽快安排作业。您的小部件可能会在一段时间内更新,也可能不会更新。
- 尝试在广播接收器中完成工作。锁定任何其他应用程序的 UI 线程。糟糕。
- 尝试在小部件接收器中执行工作。锁定任何其他应用程序的 UI 线程。糟糕。
- 滥用 GCM 使后台服务运行。工作量很大,感觉很老套。
我个人不喜欢上述任何解决方案。希望我错过了一些东西。
(更令人沮丧的是,我的应用程序已经被系统调用 onUpdate() 加载到内存中。我看不到如何将我的应用程序加载到内存中以调用 onUpdate(),但是没有给我的应用程序 1s 进行更新UI 线程外的小部件可以节省任何电池寿命。)
【问题讨论】:
-
你有没有找到更简洁的方法?我也面临 IllegalStateException
标签: android multithreading widget background-process android-8.0-oreo