reportFullyDrawn
reportFullyDrawn() 是 Android 中 Activity 类的一个方法,常用于性能指标收集,特别是用于衡量应用 冷启动时长(App Startup Time) 的一个关键标志。这个方法的调用表示“应用已经完全绘制完成,准备好与用户交互”。
你可以配合 [系统 trace 或 logcat 分析 reportFullyDrawn]。
一、方法签名
public void reportFullyDrawn ()
二、作用和用途
reportFullyDrawn() 是一个系统 API,开发者可以手动调用它,告诉系统:应用已经完成启动流程,UI 已经完全渲染,用户可以开始交互了。
这对于性能监控尤其重要,系统会:
将这个点作为 “启动完成”的时间点
将它用于 系统级的冷启动/热启动时间指标统计
一些 OEM 系统和 Android Studio 的工具也可能会读取这个指标用于性能优化建议
三、官方推荐使用场景
你应该在以下条件全部完成后调用:
首个页面的数据加载完成
首帧已经渲染(绘制)完成
动画等初始化已经结束
UI 状态已经可以响应用户操作
例如:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 加载数据(例如发起网络请求)
loadInitialData()
}
private fun loadInitialData() {
// 模拟加载耗时操作
GlobalScope.launch(Dispatchers.Main) {
delay(1000)
// 数据加载完成并更新 UI 后,表示已完全准备好
reportFullyDrawn()
}
}
}
四、和应用启动时长的关系
Android 系统统计冷启动时间的三个关键时间点:
阶段 时间点代表
冷启动开始 用户点击图标或启动 Intent 被触发
onCreate() Activity 进入 onCreate,开始构建 UI
完全绘制完成 reportFullyDrawn() 被调用时的时间
只有你显式调用了 reportFullyDrawn(),系统才会更准确地统计 冷启动完成耗时。否则它会使用一些内部 heuristics(如 onResume())作为近似。
五、调用时机建议
不要在 onCreate()、onStart()、onResume() 里立刻调用。
推荐放在所有初始化和首帧渲染完成之后,可以配合:
ViewTreeObserver.OnPreDrawListener
Choreographer.postFrameCallback
或自定义条件,确保“数据 + UI”全部准备好
六、性能监控工具支持
以下工具或平台会读取它的调用点作为关键启动指标:
Android Studio Profiler
Play Console(Startup Metrics)
Firebase Performance Monitoring
一些 OEM 定制 ROM 的性能检测服务
七、注意事项
如果你的应用不调用它,系统可能不会准确记录“完全启动”点;
如果调用过早,会低估冷启动耗时;
可以多次调用,但系统只记录第一次调用的时间点。
八、示例:更准确的首帧后调用
override fun onResume() {
super.onResume()
window.decorView.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
window.decorView.viewTreeObserver.removeOnPreDrawListener(this)
// 所有View都准备好了,接下来就要绘制首帧了
// 此时数据也已加载完,可以调用
reportFullyDrawn()
return true
}
})
}