Android应用锁屏恢复时如何在旧值显示前完成TextView更新
系统行为说明
是的,Android 10及以上版本为了优化应用切换的视觉流畅度,确实会在应用从后台恢复到前台时,优先展示应用进入暂停状态前的界面缓存快照,直到应用完成第一帧最新内容的渲染后,才会替换掉快照内容。你看到的先显示旧时间、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()) // 原有每分钟定时更新的逻辑保留在此处即可 } - 强制第一帧绘制前完成更新
如果第一种方案仍然有残留的旧时间展示,可以通过添加预绘制监听,确保系统绘制第一帧内容前就把最新时间设置到控件上: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
相关产品推荐
相关产品推荐

