简体   繁体   English

退出后 Android onCreate 被调用两次

[英]Android onCreate is called twice after backing out

I have a simple MainActivity and if the app is completely killed it looks like onCreate() is called once.我有一个简单的 MainActivity,如果应用程序被完全杀死,它看起来像 onCreate() 被调用一次。 If however I back out of the app so it still appears in the background, when I re-open it I get every log message twice.但是,如果我退出应用程序使其仍然出现在后台,当我重新打开它时,我会收到每条日志消息两次。 The weirdest part is if I generate a random number it is always the same in the 2 log messages.最奇怪的部分是,如果我生成一个随机数,它在 2 个日志消息中总是相同的。

I've tried adding android:LaunchMode="singleTop" (also singleInstance singleTask) in the activity and application tags of the 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 {  }
}
}

Here is a table of the log trace I get when I run the app on my phone from Android studio.这是我从 Android Studio 在手机上运行应用程序时得到的日志跟踪表。 Since the random numbers are the same I feel like this is actually a Logging bug in Android studio and the app isn't actually opened twice.由于随机数相同,我觉得这实际上是 Android Studio 中的日志记录错误,并且该应用程序实际上并未打开两次。

在此处输入图片说明

Realized my problem was with my logging library I used.意识到我的问题出在我使用的日志库上。

Timber was planting a new tree but wasn't uprooting old ones from being backed out so there were 2 instances of them. Timber 正在种植一棵新树,但并没有将旧树连根拔起,因此有 2 个实例。 I fixed by putting a Timber.uprootAll() just before Timber.plant(Timber.DebugTree())我固定放一个Timber.uprootAll()之前Timber.plant(Timber.DebugTree())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM