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

Android应用退出后台重开时MainActivity的onCreate被调用两次求助

你遇到的日志重复问题和Activity启动模式无关,核心原因是Timber日志树的重复注册。

问题根因分析

Timber的plant()方法是全局注册日志输出实例,你把Timber.plant(Timber.DebugTree())写在了MainActivity的onCreate()方法中:

  1. 完全杀死应用后启动,进程全新创建,MainActivity第一次初始化,只注册1次DebugTree,日志仅输出1次,符合预期。
  2. 按返回键退出时,MainActivity走销毁流程,但应用进程仍在后台存活,之前注册的DebugTree不会被清除;再次打开应用时,MainActivity重新走onCreate(),又会注册一次新的DebugTree。此时Timber全局持有2个日志输出实例,每调用一次Timber.d(),两个实例会各输出一次相同内容的日志,所以你会看到两条完全一样的日志,包括随机数、nanoTime都不会变,因为日志内容本身只生成了一次,只是被两个输出通道打印了两次。

解决方案

  • 把Timber.plant(Timber.DebugTree())移动到自定义Application类的onCreate()方法中执行。Application的onCreate()在整个进程生命周期中仅会调用一次,能保证DebugTree全局只会注册一次,不会出现重复输出问题。
  • 删掉MainActivityonDestroy()方法中super.onDestroy()后面的finish()调用,这行代码完全多余:onDestroy()本身就是Activity销毁流程的最后阶段,此时再调用finish()没有任何作用,反而可能引入不必要的生命周期异常。

如果暂时不想创建自定义Application,也可以加判断避免重复注册:

// 只在当前没有注册任何DebugTree的时候才注册
if (Timber.treeCount() == 0) {
    Timber.plant(Timber.DebugTree())
}

内容的提问来源于stack exchange,提问作者Kyle O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:03