Android Activity在使用黑暗模式时被示例化两次

t1qtbnec  于 2023-11-15  发布在  Android
关注(0)|答案(4)|浏览(181)

我的启动器活动,即MainActivity在使用AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)时被示例化了两次,这导致了两次网络调用并产生了奇怪的行为。
有没有什么可以控制它,让它只初始化一次?我试过使用launchMode =“singleTop”和“singleInstance”

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. setContentView(R.layout.activity_main)
  4. AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
  5. mRequestQueue = Volley.newRequestQueue(this)
  6. Log.e(TAG,"Skillet")
  7. loadStateData()
  8. initializeListeners()
  9. }

字符串

oalqel3c

oalqel3c1#

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

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

字符串
在onCreate()的super之前调用暗模式函数
它将防止两次示例化活动

e5nqia27

e5nqia272#

活动在某些场景中重新启动,比如方向改变,这没有什么错。
而不是阻止Activity重新启动,这是其生命周期的一部分,你可以做的另一件事,也是我鼓励你做的事情是使用ViewModel来处理这些任务,因为它在推荐的应用架构中被推荐,这样当你的Activity重新启动并要求其ViewModel时:

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

字符串
它重用相同的ViewModel,任务继续执行,就像什么都没有发生一样。
实际上,如果你想遵循这种架构,任务应该在存储库中完成,但是ViewModel应该负责它,并且在Activity重新启动时不会重新创建它。
我建议你做AndroidKotlin基础05.1 codelab关于这一点。

nxagd54h

nxagd54h3#

为那些使用“绑定”的人找到了解决方案
这很有趣,但工作:

  1. protected void onCreate(Bundle savedInstanceState) {
  2. sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
  3. AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
  4. binding = ActivityMainBinding.inflate(getLayoutInflater());
  5. super.onCreate(savedInstanceState);
  6. setContentView(binding.getRoot());
  7. binding = ActivityMainBinding.inflate(getLayoutInflater());
  8. setContentView(binding.getRoot());
  9. }

字符串

展开查看全部
20jt8wwn

20jt8wwn4#

如果上述任何一种解决方案都不起作用;

  1. public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
  2. {
  3. var theme = this.Resources.Configuration.UiMode & Android.Content.Res.UiMode.NightMask;
  4. if (theme == Android.Content.Res.UiMode.NightYes)
  5. AppCompatDelegate.DefaultNightMode = AppCompatDelegate.ModeNightYes;
  6. else
  7. AppCompatDelegate.DefaultNightMode = AppCompatDelegate.ModeNightNo;
  8. base.OnCreate(savedInstanceState, persistentState);
  9. }

字符串

展开查看全部

相关问题