Android 当且仅当夜间模式打开时,屏幕旋转发生变化时,才会重新创建活动

Android 当且仅当夜间模式打开时,屏幕旋转发生变化时,才会重新创建活动,android,android-appcompat,android-resources,android-night-mode,Android,Android Appcompat,Android Resources,Android Night Mode,我有这个活动(AppCompatActivity的子类): 现在,当我在正常(即“Day”)模式下旋转手机时,我会接到一个呼叫,呼叫onConfigurationChanged,但活动不会重新创建 但是,当应用程序设置为夜间模式时(在创建活动之前,在我的应用程序中调用AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.Mode\u Night\u YES),然后旋转手机,我首先接到一个对onConfigurationChanged的

我有这个
活动
(AppCompatActivity的子类):


现在,当我在正常(即“Day”)模式下旋转手机时,我会接到一个呼叫,呼叫
onConfigurationChanged
,但
活动不会重新创建

但是,当应用程序设置为夜间模式时(在创建
活动之前,在我的
应用程序中调用
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.Mode\u Night\u YES)
,然后旋转手机,我首先接到一个对
onConfigurationChanged
的调用,但是
活动也会被重新创建,即使
uiMode
根本没有改变!当我将
uiMode
添加到
configChanges
中时,这种情况就消失了,在我的
AndroidManifest.xml
中应该忽略它,但我需要这样做似乎很奇怪

从来源来看,似乎:

  • onConfigurationChanged
    调用
    getDelegate().onConfigurationChanged(newConfig)转到
    AppCompateDelegateImpl.onConfigurationChanged(newConfig)
  • 在那里,
    applyDayNight()
    被调用
  • 在那里,
    getNightMode
    返回
    appcompatedelegateimpl.MODE\u NIGHT\u YES
    ,这很有意义,因为这是我设置的
    mapNightMode
    只返回未更改的值。然后调用
    updateForNightMode(appcompatedelegateimpl.MODE\u NIGHT\u YES)
  • 在那里,
    newNightMode
    被正确计算为
    配置。UI\u MODE\u NIGHT\u YES
    但是
    currentNightMode
    (从
    mContext.getResources().getConfiguration().uiMode
    读取)在每次旋转后总是显示为
    配置。UI\u MODE\u NIGHT\u NO
    ,即使旋转前在夜间模式下渲染了
    活动

那么,这里发生了什么,我能做些什么来获得更一致的行为?(在屏幕旋转后重新创建(或不创建)活动
,无论应用程序是否处于夜间模式。)

似乎是一个bug,将根据此在AppCompat v1.1.0中修复


从AppCompat v1.1.0-alpha03开始,您不再需要
configChanges
中的
uiMode
-标志,作为一种解决方法,您似乎需要将
uiMode
添加到配置更改列表中:
<activity
    android:name=".ui.settings.SettingsActivity"
    android:configChanges="keyboardHidden|smallestScreenSize|orientation|screenSize|screenLayout"
    android:launchMode="singleTask"
    android:parentActivityName=".ui.main.MainActivity" />