【问题标题】:Android Activity is getting instantiate twice while using Dark ModeAndroid Activity 在使用暗模式时被实例化两次
【发布时间】:2020-04-09 18:49:57
【问题描述】:

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

【问题讨论】:

  • 为什么你在活动中这样做,而不是在 App 类中? setDefaultNightMode 总是做娱乐活动。因为你的配置改变了。也许您只是将您的 api 调用移到另一个活动生命周期方法中?

标签: android android-activity android-lifecycle android-darkmode


【解决方案1】:

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

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

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

它会阻止两次实例化活动

【讨论】:

    【解决方案2】:

    活动在某些情况下会重新启动,例如方向变化,这没有什么问题。

    除了阻止活动重新启动(这是其生命周期的一部分)之外,您可以做的另一件事是我鼓励您做的另一件事是使用 ViewModel 来处理此任务,因为它在 @ 中被推荐987654322@ 这样当您的活动重新启动并请求其 ViewModel 时:

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

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

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

    我建议您对此进行Android Kotlin Fundamentals 05.1 codelab

    【讨论】:

      【解决方案3】:

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

      这很有趣,但很有效:

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

      【讨论】:

        猜你喜欢
        • 2020-03-03
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 2023-04-05
        相关资源
        最近更新 更多