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

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

我的启动器活动,即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()
}

字符串

oalqel3c

oalqel3c1#

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

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

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

e5nqia27

e5nqia272#

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

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

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

nxagd54h

nxagd54h3#

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

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());
    }

字符串

20jt8wwn

20jt8wwn4#

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

public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
        {

            var theme = this.Resources.Configuration.UiMode & Android.Content.Res.UiMode.NightMask;

            if (theme == Android.Content.Res.UiMode.NightYes)
                AppCompatDelegate.DefaultNightMode = AppCompatDelegate.ModeNightYes;

            else
                AppCompatDelegate.DefaultNightMode = AppCompatDelegate.ModeNightNo;

            base.OnCreate(savedInstanceState, persistentState);
         
        }

字符串

相关问题