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

Android应用锁屏恢复时如何在旧值显示前完成TextView更新

系统行为说明

是的,Android 10及以上版本为了优化应用切换的视觉流畅度,确实会在应用从后台恢复到前台时,优先展示应用进入暂停状态前的界面缓存快照,直到应用完成第一帧最新内容的渲染后,才会替换掉快照内容。你看到的先显示旧时间、1秒后跳转为新时间的现象,就是快照展示和应用实际渲染的时间差导致的。

解决方案

你可以通过以下方法优先更新时间文本,尽可能缩小甚至消除时间差:

  1. 提前更新逻辑的执行时机
    把时间更新逻辑从onResume提前到更早触发的onRestart生命周期回调中,同时保留onResume中的更新逻辑做兜底,确保不会出现更新遗漏:
    // 提前初始化时间格式作为成员变量,避免重复创建实例
    private val timeFormat = SimpleDateFormat("h:mm", Locale.getDefault())
    
    override fun onRestart() {
        super.onRestart()
        clockView.text = timeFormat.format(Date())
    }
    
    override fun onResume() {
        super.onResume()
        clockView.text = timeFormat.format(Date())
        // 原有每分钟定时更新的逻辑保留在此处即可
    }
    
  2. 强制第一帧绘制前完成更新
    如果第一种方案仍然有残留的旧时间展示,可以通过添加预绘制监听,确保系统绘制第一帧内容前就把最新时间设置到控件上:
    override fun onRestart() {
        super.onRestart()
        window.decorView.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                clockView.text = timeFormat.format(Date())
                // 移除监听避免重复触发
                window.decorView.viewTreeObserver.removeOnPreDrawListener(this)
                return true
            }
        })
    }
    

注意事项

  • 推荐使用线程安全、性能更优的DateTimeFormatter替代SimpleDateFormat处理时间格式化。
  • 不要随意禁用系统窗口快照功能,否则会导致应用恢复时出现短暂黑屏,反而降低使用体验。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 18:36:07