Jetpack Glance Widget应用退出时触发更新致闪烁,如何解决?
我使用Glance 1.0.0-alpha05及GlanceAppWidgetHost 0.2.2实现了一个Glance Widget,其appwidget-provider配置如下(注意updatePeriodMillis = 0):
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:description="@string/loyalty_card_title" android:minWidth="110dp" android:minHeight="50dp" android:resizeMode="horizontal|vertical" android:targetCellWidth="2" android:targetCellHeight="2" android:widgetCategory="home_screen|keyguard" android:updatePeriodMillis="0" android:initialLayout="@layout/loyalty_card_widget_initial" android:previewImage="@drawable/splash_logo" tools:targetApi="s" /> <!-- targetCellWidth and -height will be ignored by api < s, which is fine -->
每次关闭(或打开)应用时,Widget都会触发更新,短暂显示initialLayout出现闪烁,但Widget数据并未发生变化。请问如何阻止该情况?
此问题看似与相关社区问题及Google Issue报告类似,但我项目中未使用WorkManager,不确定是否相关。
移除
initialLayout配置
配置initialLayout后,Widget更新时系统会先加载该布局,再替换为Glance生成的内容,这是闪烁的核心诱因。若你的Widget已通过Glance实现完整UI,直接删除android:initialLayout="@layout/loyalty_card_widget_initial"即可避免初始布局的短暂显示。管控更新触发时机
排查应用关闭/打开时的代码,看是否存在主动调用Widget更新方法(如updateAppWidget或Glance更新API)的逻辑。若无必要更新需求,移除这些触发逻辑,仅在数据真正变化时发起更新请求。优化Glance更新逻辑
在Glance Widget实现类中重写shouldRefresh方法,对比新旧状态,仅当数据确实变化时返回true,否则跳过更新:override fun shouldRefresh(state: State, oldState: State): Boolean { // 按需对比状态字段,确保仅数据变化时才刷新 return state != oldState }这样即便收到更新请求,Glance也会因状态未变更而跳过UI重绘,避免不必要的闪烁。
升级Glance版本
你使用的1.0.0-alpha05是早期测试版本,后续稳定版本大概率修复了这类无意义更新触发的问题。尝试升级到Glance正式版(如1.0.0及以上),同步升级GlanceAppWidgetHost到兼容版本,问题可能直接解决。
内容的提问来源于stack exchange,提问作者Nino van Hooff

