ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何在Android 8.0中正确更新小部件 – Oreo – API 26

2019-09-28 11:24:06  阅读:175  来源: 互联网

标签:android-8-0-oreo android multithreading widget background-process


假设我有一个将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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有