【问题标题】:Android onCreate is called twice after backing outAndroid onCreate 在退出后被调用两次
【发布时间】: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 错误,并且该应用实际上并没有打开两次。

【问题讨论】:

    标签: android kotlin oncreate


    【解决方案1】:

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

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

    【讨论】:

    • 我建议你在应用程序类中种植你的树,这样它就可以保证只发生一次,并且绝对可以在任何地方使用。这是使用它的预期方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多