Android应用退出后台重开时MainActivity的onCreate被调用两次求助
你遇到的日志重复问题和Activity启动模式无关,核心原因是Timber日志树的重复注册。
问题根因分析
Timber的plant()方法是全局注册日志输出实例,你把Timber.plant(Timber.DebugTree())写在了MainActivity的onCreate()方法中:
- 完全杀死应用后启动,进程全新创建,MainActivity第一次初始化,只注册1次DebugTree,日志仅输出1次,符合预期。
- 按返回键退出时,MainActivity走销毁流程,但应用进程仍在后台存活,之前注册的DebugTree不会被清除;再次打开应用时,MainActivity重新走
onCreate(),又会注册一次新的DebugTree。此时Timber全局持有2个日志输出实例,每调用一次Timber.d(),两个实例会各输出一次相同内容的日志,所以你会看到两条完全一样的日志,包括随机数、nanoTime都不会变,因为日志内容本身只生成了一次,只是被两个输出通道打印了两次。
解决方案
- 把
Timber.plant(Timber.DebugTree())移动到自定义Application类的onCreate()方法中执行。Application的onCreate()在整个进程生命周期中仅会调用一次,能保证DebugTree全局只会注册一次,不会出现重复输出问题。 - 删掉MainActivity
onDestroy()方法中super.onDestroy()后面的finish()调用,这行代码完全多余:onDestroy()本身就是Activity销毁流程的最后阶段,此时再调用finish()没有任何作用,反而可能引入不必要的生命周期异常。
如果暂时不想创建自定义Application,也可以加判断避免重复注册:
// 只在当前没有注册任何DebugTree的时候才注册 if (Timber.treeCount() == 0) { Timber.plant(Timber.DebugTree()) }
内容的提问来源于stack exchange,提问作者Kyle O.
相关产品推荐
相关产品推荐

