Android Activity 在使用深色模式时被实例化两次

Android Activity is getting instantiate twice while using Dark Mode

我的启动器 activity 即 MainActivity 在使用时被实例化了两次 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) 这导致了两次网络调用并产生了奇怪的行为。

有没有办法控制这个只初始化一次?。 我试过使用 launchMode = "singleTop" 和 "singleInstance"

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    mRequestQueue = Volley.newRequestQueue(this)
    Log.e(TAG,"Skillet")
    loadStateData()
    initializeListeners()
}

Activity在某些情况下重新启动,例如方向改变,这没有错。

不是阻止 activity 重新启动,这是其生命周期的一部分,你可以做的另一件事是我鼓励你做的是使用 ViewModel to handle this tasks as it is recomended in the recommended app architecture 这样当您的 activity 重新启动并要求其 ViewModel:

viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)

它重复使用相同的 ViewModel,任务继续进行,就好像什么都没发生一样。

实际上,如果您想遵循该架构,任务应该在存储库中完成,但 ViewModel 应该负责它并且在 activity 重新启动时不会重新创建它。

我建议你Android Kotlin Fundamentals 05.1 codelab做这件事。

在尝试了我的一些做法后找到了解决方案

override fun onCreate(savedInstanceState: Bundle?) {
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    }

在onCreate()的super之前调用暗模式函数

它将阻止实例化 activity 两次

为使用“绑定”的人找到解决方案

这很有趣但有效:

protected void onCreate(Bundle savedInstanceState) {

    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    super.onCreate(savedInstanceState);
    setContentView(binding.getRoot());

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    }