Android onCreate 在退出后被调用两次

Posted

技术标签:

【中文标题】Android onCreate 在退出后被调用两次【英文标题】:Android onCreate is called twice after backing out 【发布时间】:2021-12-17 11:58:43 【问题描述】:

我有一个简单的 MainActivity,如果应用程序被完全杀死,它看起来像 onCreate() 被调用一次。但是,如果我退出应用程序,它仍然出现在后台,当我重新打开它时,我会收到每条日志消息两次。最奇怪的部分是,如果我生成一个随机数,它在 2 条日志消息中总是相同的。

我尝试在 Manifest 的活动和应用程序标签中添加 android:LaunchMode="singleTop"(也是 singleInstance singleTask)。

class MainActivity : AppCompatActivity() 

private val binding: ActivityMainBinding by lazy 
    ActivityMainBinding.inflate(layoutInflater)


override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    val view = binding.root
    setContentView(view)
    setupViews()
    val data: Uri? = intent?.data
    DataHolder.getInstance().setItem(data)
    Timber.plant(Timber.DebugTree())
    setupInjection()
    Timber.d("review nanoTime = $System.nanoTime()")
    Timber.d("review savedInstance = $savedInstanceState")
    Timber.d("review random = $Random.nextInt()")


override fun onPause() 
    Timber.d("review onPause()")
    super.onPause()


override fun onStop() 
    Timber.d("review onStop()")
    super.onStop()


override fun onDestroy() 
    Timber.d("review onDestroy()")
    super.onDestroy()
    finish()


override fun onStart() 
    Timber.d("review onStart()")
    super.onStart()


override fun onRestart() 
    Timber.d("review onRestart()")
    super.onRestart()


override fun onResume() 
    Timber.d("review onResume()")
    super.onResume()

private fun setupInjection() 
    val appInjector = InjectorImpl(
        firebaseAuth = FirebaseAuth.getInstance()
    )
    Injector.initialize(appInjector)


private fun setupViews() = binding.apply 
    val navController = findNavController(R.id.nav_host_fragment)

    navView.setupWithNavController(navController)
    navView.setOnItemSelectedListener  item ->
        when (item.itemId)
            R.id.navigation_item_calculator -> 
                navController.navigate(BuilderFragmentDirections.actionBuilderToCalculator())
            
            R.id.navigation_item_builder -> 
                navController.navigate(CalculatorFragmentDirections.actionCalculatorToBuilder())
            
        
        true
    
    navView.setOnItemReselectedListener   


这是我从 Android Studio 在手机上运行应用程序时获得的日志跟踪表。由于随机数相同,我觉得这实际上是 Android Studio 中的一个 Logging 错误,并且该应用实际上并没有打开两次。

【问题讨论】:

【参考方案1】:

意识到我的问题在于我使用的日志库。

Timber 正在种植一棵新树,但没有将旧树连根拔起,因此有 2 个实例。我通过在Timber.plant(Timber.DebugTree()) 之前放置Timber.uprootAll() 来修复

【讨论】:

我建议你在应用程序类中种植你的树,这样它就可以保证只发生一次,并且绝对可以在任何地方使用。这是使用它的预期方式。

以上是关于Android onCreate 在退出后被调用两次的主要内容,如果未能解决你的问题,请参考以下文章

Android app启动activity并调用onCreate()方法时都默默地干了什么?

android service 开机启动后被啥情况下会被自动关闭掉?

Android 11 onCreate() 调用每秒钟都丢失

在 OnCreate() Android 中为联系人调用 onActivityResult

如何使用 Android 缓存视图并避免每次都调用 onCreate

android 关于为什么在onCreate里调用view.getChildAt.getLeft() 没有值!