Activity 从 Coroutine 启动时启动了两次

问题描述

我正在使用 SplashActivity,为我的应用准备一些数据',然后重定向到我的 MainActivity。

我在协程中执行此操作,以使用一些数据库事务。

如果我从协程内部启动 MainActivity,它会启动两次(当按下“返回”按钮时,它会关闭 MainActivity 并在后面显示第二个 MainActivity)。 如果我从协程外部启动 MainActivity,它就会工作(按下“返回”按钮时,它会关闭 MainActivity 和应用程序)

SplashActivity 的一个简单示例:

class SplashActivity : AppCompatActivity() {
    private lateinit var activityScope: Coroutinescope
    private lateinit var image: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        prepareApplication()
    }

    override fun onPause() {
        activityScope.cancel()
        super.onPause()
    }

    override fun onResume() {
        super.onResume()
        prepareApplication()
    }

    private fun prepareApplication() {
        activityScope = Coroutinescope(dispatchers.Main)
        activityScope.launch {
            // This starts the MainActivity twice
            startActivity(Intent(this@SplashActivity,MainActivity::class.java))
            finish()
        }
        // This starts the MainActivity once
        // startActivity(Intent(this@SplashActivity,MainActivity::class.java))
        // finish()
    }
}

你知道为什么以及如何避免这种情况吗?

谢谢!

解决方法

您从 onCreate 和 onResume 调用此函数,由于启动不会立即执行,因此 startActivity 调用都添加到主线程队列中。在第二种情况下,当您不使用 launch 时,它会立即执行,因此不会发生第二次调用。