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 重新启动时不会重新创建它。
在尝试了我的一些做法后找到了解决方案
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());
}
我的启动器 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 重新启动时不会重新创建它。
在尝试了我的一些做法后找到了解决方案
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());
}