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" />