应用程序恢复/重启时的 Android 手动暗模式导致应用程序主题无法正常工作

时间:2021-06-03 17:10:26

标签: android android-theme android-dark-theme android-darkmode

您好,我在手动管理暗模式时遇到了一个大问题,所以我会马上解决:

应用程序如何工作

在应用程序启动时,第一个 Activity 在 SharedPreferences 中检查用户是否选择启用暗模式或保持亮模式(默认),然后它会根据用户偏好对其进行相应更改:

编辑:正如 CSmith 所要求的,当主题选择器在活动中被调用时

//FirstActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
...

这里是主题选择器方法

//AppThemeSelector.class
    public static void checkAndShowTheme(Context context){
        SharedPreferences sharedPreferences = context.getSharedPreferences(
                PreferencesValues.SHARED_DARKMODE_MAP, Context.MODE_PRIVATE
        );

        boolean darkMode = sharedPreferences.getBoolean(PreferencesValues.SHARED_DARKMODE_ENABLED, false);

        if(darkMode){
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }else{
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
    }

到目前为止一切顺利,无论何时启动,它都会将主题设置为用户选择的主题,并且一切正常。

问题出在哪里

显然这个问题似乎只发生在我的小米 A2 lite (Android 10) 上,因为我已经在 Pixel 2 (Android 11) 和模拟器 (Android 10) 上进行了测试,并且当应用程序从最近的版本中恢复时应用一切正常。

问题

重现我的问题的一致方法是: 假设我的应用程序设置为手动模式,而我的系统处于暗模式。我打开应用程序(留在家里活动或去其他活动会导致同样的问题)然后我进入系统设置并更改系统语言。 当我从最近的应用程序选项卡重新打开应用程序时,它看起来像是应用程序尝试重新启动,但它在中途崩溃(不确定,因为 logcat 没有显示任何有关崩溃的信息,应用程序也没有显示任何有关崩溃的对话框),并且当它启动时它会自动设置它的主题是系统主题(所以在我的例子中它进入黑暗模式)。

此时的问题是,一些原本应该在暗模式下看到的文本现在有了亮模式主题,使它们与黑色背景融为一体;应用程序中用于从暗模式更改为亮模式的开关保持正确设置(显示未启用暗模式),但应用处于暗模式。如果应用重新启动,一切都会恢复正常,并且应用以浅色主题正确显示。

当应用长时间处于后台时,我无法重现该问题,但我认为它也可能发生。

感谢您的宝贵时间!

2 个答案:

答案 0 :(得分:1)

我认为您的问题很可能是因为 Andriod Q 及更高版本中的强制暗模式。 MIUI 以某种奇怪的方式实现了它,它可以在黑暗模式下转换每个应用程序。你应该在你的灯光主题样式文件中使用它

<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>

答案 1 :(得分:1)

AppCompatDelegate.setDefaultNightMode() 可能导致重新创建 Activity,我通常会执行一次此检查,并在 Application 类覆盖中执行此操作。

请尝试将您对 checkAndShowTheme() 的调用移至应用程序类覆盖的 onCreate 方法

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
    }
}

通过这种方式,setDefaultNightMode() 在应用程序生命周期的早期被调用一次。

老实说我不知道​​为什么小米A2表现出不同的行为,我只是建议一个我成功遵循的做法,希望它可以帮助你。