Activity 当且仅当夜间模式开启时屏幕旋转改变时重新创建
Activity is recreated when screen rotation changes if-and-only-if Night Mode is ON
我有这个 Activity
(AppCompatActivity
的子类):
<activity
android:name=".ui.settings.SettingsActivity"
android:configChanges="keyboardHidden|smallestScreenSize|orientation|screenSize|screenLayout"
android:launchMode="singleTask"
android:parentActivityName=".ui.main.MainActivity" />
现在,当我在正常(即 "Day")模式下旋转 phone 时,我收到了对 onConfigurationChanged
的调用,但没有重新创建 Activity
.
但是,当应用程序设置为夜间模式时(通过在创建 Activity
之前在我的 Application
中调用 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
)并且我 然后 旋转 phone,我首先接到对 onConfigurationChanged
的调用,但随后 Activity
被 也 重新创建,即使 uiMode
一点都没变!当我将 uiMode
添加到应该在我的 AndroidManifest.xml
中忽略的 configChanges
时,这消失了,但我需要这样做似乎很奇怪。
通过查看源代码似乎是:
onConfigurationChanged
调用 getDelegate().onConfigurationChanged(newConfig);
转到 AppCompatDelegateImpl.onConfigurationChanged(newConfig)
- 在那里,
applyDayNight()
被调用
- 在那里,
getNightMode
returns AppCompatDelegateImpl.MODE_NIGHT_YES
,这是有道理的,因为这是我设置的。 mapNightMode
只是 returns 那个值没变。然后 updateForNightMode(AppCompatDelegateImpl.MODE_NIGHT_YES)
被调用
- 在那里,
newNightMode
被正确计算为 Configuration.UI_MODE_NIGHT_YES
但是 currentNightMode
(从 mContext.getResources().getConfiguration().uiMode
读入)每次旋转后总是显示 Configuration.UI_MODE_NIGHT_NO
,即使 Activity
在 旋转之前 以夜间模式渲染。
那么,这里发生了什么,我可以做些什么来获得更一致的行为? (在屏幕旋转后重新创建(或不创建)Activity
,无论应用是否处于夜间模式。)
似乎是一个错误,将根据此 issue.
在 AppCompat v1.1.0 中修复
从 AppCompat v1.1.0-alpha03 开始,您不再需要 configChanges
中的 uiMode
标记作为解决方法
我有这个 Activity
(AppCompatActivity
的子类):
<activity
android:name=".ui.settings.SettingsActivity"
android:configChanges="keyboardHidden|smallestScreenSize|orientation|screenSize|screenLayout"
android:launchMode="singleTask"
android:parentActivityName=".ui.main.MainActivity" />
现在,当我在正常(即 "Day")模式下旋转 phone 时,我收到了对 onConfigurationChanged
的调用,但没有重新创建 Activity
.
但是,当应用程序设置为夜间模式时(通过在创建 Activity
之前在我的 Application
中调用 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
)并且我 然后 旋转 phone,我首先接到对 onConfigurationChanged
的调用,但随后 Activity
被 也 重新创建,即使 uiMode
一点都没变!当我将 uiMode
添加到应该在我的 AndroidManifest.xml
中忽略的 configChanges
时,这消失了,但我需要这样做似乎很奇怪。
通过查看源代码似乎是:
onConfigurationChanged
调用getDelegate().onConfigurationChanged(newConfig);
转到AppCompatDelegateImpl.onConfigurationChanged(newConfig)
- 在那里,
applyDayNight()
被调用 - 在那里,
getNightMode
returnsAppCompatDelegateImpl.MODE_NIGHT_YES
,这是有道理的,因为这是我设置的。mapNightMode
只是 returns 那个值没变。然后updateForNightMode(AppCompatDelegateImpl.MODE_NIGHT_YES)
被调用 - 在那里,
newNightMode
被正确计算为Configuration.UI_MODE_NIGHT_YES
但是currentNightMode
(从mContext.getResources().getConfiguration().uiMode
读入)每次旋转后总是显示Configuration.UI_MODE_NIGHT_NO
,即使Activity
在 旋转之前 以夜间模式渲染。
那么,这里发生了什么,我可以做些什么来获得更一致的行为? (在屏幕旋转后重新创建(或不创建)Activity
,无论应用是否处于夜间模式。)
似乎是一个错误,将根据此 issue.
在 AppCompat v1.1.0 中修复从 AppCompat v1.1.0-alpha03 开始,您不再需要 configChanges
中的 uiMode
标记作为解决方法