问题描述
我在使用 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 (将#修改为@)