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
    }
})

}

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器