You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:50:25