如何在Android 8.0中正确更新小部件 – Oreo – API 26
作者:互联网
假设我有一个将targetSDKVersion设置为26的应用程序的小部件.此小部件需要100毫秒到10秒才能更新.大部分时间都在1s以下.在Android O之前,如果在我的AppWidgetProvider上调用了onUpdate(),我可以启动后台服务来更新这个小部件.但是,如果您尝试该行为,Android O将返回IllegalStateException.启动前台服务的显而易见的解决方案似乎是一种极端的措施,可以在99%的时间内在10秒以内完成.
可能的解决方案
>启动前台服务以更新窗口小部件.用户通知会在10s内消失.
>使用JobScheduler尽快安排作业.您的小部件可能会或可能不会更新一段时间.
>尝试在广播接收器中完成工作.锁定任何其他应用程序的UI线程.呸.
>尝试在小部件接收器中工作.锁定任何其他应用程序的UI线程.呸.
>滥用GCM以运行后台服务.很多工作和感觉hacky.
我个人并不喜欢上述任何一种解决方案.希望我错过了一些东西.
(更令人沮丧的是,我的应用程序已经被系统调用onUpdate()加载到内存中.我没有看到如何将我的应用程序加载到内存中以调用onUpdate(),但后来没有给我的应用程序1s更新小部件UI线程正在为任何人节省电池寿命.)
解决方法:
您没有指出更新触发机制是什么.您似乎担心延迟(“您的小部件可能会或可能不会在一段时间内更新”),因此我将假设您的关注与用户与应用小部件的交互相关联,例如点击按钮.
Use JobScheduler to schedule a job as quickly as possible. Your widget may or may not get updated for a while.
这是“使用JobIntentService”的变体,AFAIK是此类场景的推荐解决方案.
其他选择包括:
>将getForegroundService()与PendingIntent一起使用.有了这个,你有效地“小发誓”你的服务将在ANR时间范围内调用startForeground().如果工作时间超过几秒钟,请调用startForeground()以确保Android不会变得暴躁.这应该最小化前景通知出现的时间.而且,如果用户点击了一个按钮并且您在几秒钟后仍然忙于工作,您可能希望显示通知或以其他方式做某事让用户知道他们要求的内容仍在进行中.
>在BroadcastReceiver上使用goAsync(),在不占用主应用程序线程的情况下在接收器的上下文中工作.我没有尝试使用Android 8.0,所以YMMV.
标签:android-8-0-oreo,android,multithreading,widget,background-process 来源: https://codeday.me/bug/20190928/1827213.html