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

应用程序恢复/重启时的Android手动暗模式导致应用程序主题无法正常工作,android,android-theme,android-dark-theme,android-darkmode,Android,Android Theme,Android Dark Theme,Android Darkmode,您好,我在手动管理暗模式时遇到了一个大问题,因此我将立即开始: 这个应用程序是如何工作的 在应用程序启动时,如果用户选择启用暗模式或保持亮模式(默认),则第一个活动将检查SharedReferences,然后根据用户首选项相应地更改它: 编辑:正如CSmith所要求的,这里是在活动中调用主题选择器的时间 //FirstActivity @Override protected void onCreate(Bundle savedInstanceState) { su

您好,我在手动管理暗模式时遇到了一个大问题,因此我将立即开始:

这个应用程序是如何工作的 在应用程序启动时,如果用户选择启用暗模式或保持亮模式(默认),则第一个活动将检查SharedReferences,然后根据用户首选项相应地更改它:

编辑:正如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)和emulator(Android 10)上进行了测试,当应用程序从最近的应用程序恢复时,一切正常

问题 复制我的问题的一致方法是: 假设我的应用程序设置为手动照明模式,而我的系统处于暗模式。我打开应用程序(无论是呆在家里还是去另一个活动都会导致同样的问题),然后进入系统设置并更改系统语言。 当我从“最近的应用程序”选项卡重新打开应用程序时,它看起来像是应用程序试图重新启动,但中途崩溃(不确定这一点,因为logcat没有显示任何关于崩溃的信息,应用程序也没有显示任何关于崩溃的对话框),当它启动时,它会自动将其主题设置为系统主题(因此在我的示例中,它会进入暗模式)

这一点上的问题是,一些原本应该在黑暗模式下看到的文本现在有了光明模式主题,使它们与黑色背景混合;应用程序中用于从暗模式切换到亮模式的开关保持正确设置(显示暗模式未启用),但应用程序处于暗模式。如果重新启动应用程序,一切将恢复正常,应用程序将正确显示在灯光主题中

当应用程序在后台停留很长时间时,我无法重现这个问题,但我认为它也可能发生


谢谢你抽出时间

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

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

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

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

AppCompatDelegate.setDefaultNightMode()
可能会导致重新创建活动,我通常在
应用程序中执行一次此检查

请尝试将对
checkAndShowTheme()
的调用移动到应用程序类重写的
onCreate
方法

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
    }
}
这样在应用程序生命周期的早期调用一次
setDefaultNightMode()


老实说,我不知道为什么小米米A2表现出不同的行为,我只是建议一种我已经成功遵循的实践,并希望它能帮助您。

AppCompatDelegate.setDefaultNightMode()
可以导致活动被重新创建,我通常执行此检查一次,并在
应用程序中执行此检查

请尝试将对
checkAndShowTheme()
的调用移动到应用程序类重写的
onCreate
方法

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
    }
}
这样在应用程序生命周期的早期调用一次
setDefaultNightMode()


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

我的Mi A2 Lite不使用MIUI,但我已经尝试了您的修复程序,不幸的是它似乎没有任何作用。我的Mi A2 Lite不使用MIUI,但我已经尝试了您的修复程序,不幸的是它似乎没有任何作用。您可以显示您在启动活动中检查
共享引用的位置吗调用
setDefaultNightMode
API?当然!我刚刚更新了main post@csmith请尝试将
checkAndShowTheme()
调用移动到
应用程序
类重写及其
onCreate()
方法(请参阅)?还要在
checkAndShowTheme()
中添加一些日志记录,以显示调用它的时间,并确认从
SharedReferences
读取的值。我已经有一个管理数据库的应用程序类,并且您的逻辑是正确的。将检查放入应用程序类后,记录
checkAndShowTheme()
方法的值总是记录正确的值,问题似乎得到了解决。我不能百分之百确定这个问题是否消失了,因为昨天重新启动手机后,在更改代码之前,我再也没有发现这个问题了。不管怎么说,目前你的解决方案没有问题,所以我想把你的答案标记为接受。如果你觉得可以的话,写一篇文章,我会记下来。感谢您的时间@csmithc您可以显示您在启动活动中检查
SharedReferences
并调用
setDefaultNightMode
API的位置吗?当然可以!我刚刚更新了main post@csmith请尝试将
checkAndShowTheme()
调用移动到
应用程序
类重写及其
onCreate()
方法(请参阅)?还要在
checkAndShowTheme()
中添加一些日志记录,以显示调用它的时间,并确认从
SharedReferences
读取的值。我已经有一个管理数据库的应用程序类,并且您的逻辑是正确的。将检查放入应用程序类后,记录
checkAndShowTheme()方法的值总是记录正确的值和