Android Handler Looper 黑暗主题行为

问题描述

我在使用 Handler(Looper.getMainLooper()) 时遇到了有趣的行为。如果我的应用程序主题(白天/黑夜)设置为与操作系统设置不同,它会执行两次。例如,如果在设备设置中关闭了深色模式并且我的应用 MainActivity 应用了深色主题,则 MainActivity 会启动两次。我没有找到任何解释为什么会发生这种情况。

SplashActivity 非常简单

class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.splash_screen_layout)

        Handler(Looper.getMainLooper()).postDelayed({
            val intent = Intent(this,MainActivity::class.java)
            startActivity(intent)
            Log.i("SPLASH","Main activity started")
            finish()
        },2000)
    }

}

Main Activity 具有以下功能,可以检查应用设置中保存的主题并应用它:

功能

private fun checkDarkMode(){
        when (MainSettings(this).darkMode) {
            0 -> {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
                delegate.applyDayNight()
            }
            1 -> {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
                delegate.applyDayNight()
            }
            2 -> {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
                delegate.applyDayNight()
            }
        }
    }

因此,如果在设备设置中关闭了暗模式,那么 AppCompatDelegate.MODE_NIGHT_YES 的处理程序代码将执行两次,其他人按预期执行一次。

反之亦然,如果设备处于黑暗状态,则 AppCompatDelegate.MODE_NIGHT_NO 的代码执行两次。

正如我所说,我没有找到任何解释或解决方案,所以我所做的只是将处理程序定义为 val 并在 SplashActivity 的 onPause 或 onDestroy 中取消了所有内容

private val handler = Handler(Looper.getMainLooper())

override fun onPause() {
        super.onPause()
        handler.removeCallbacksAndMessages(null)
    }

所以我的问题是为什么会发生这种情况,还有其他方法可以避免吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)