Android “倾听”;“黑暗主题”;在通知区域切换,并收到更改通知

Android “倾听”;“黑暗主题”;在通知区域切换,并收到更改通知,android,android-theme,android-10.0,Android,Android Theme,Android 10.0,我可以通过调用resources.configuration.uiMode和configuration.UI\u MODE\u NIGHT\u MASK来获取UI\u MODE\u NIGHT\u MASK 我需要倾听这个变量,并在接收新值时改变我的主题 我想我可以添加一个BroadcastReceiver,这样我就可以做一个getSystemService(一个来自上下文的常量),并注册一个类似于ConnectivityManager.NetworkCallback的主题回调。但我只在文档中找

我可以通过调用
resources.configuration.uiMode
configuration.UI\u MODE\u NIGHT\u MASK
来获取
UI\u MODE\u NIGHT\u MASK

我需要倾听这个变量,并在接收新值时改变我的主题


我想我可以添加一个
BroadcastReceiver
,这样我就可以做一个
getSystemService(一个来自上下文的常量)
,并注册一个类似于
ConnectivityManager.NetworkCallback
的主题回调。但我只在文档中找到了这些:在我的主题样式上扩展
主题.MaterialComponents.DayNight
,并在夜间使用
值。已经有公认答案的问题涉及本文档。

要了解
uiMode
更改,请在
AndroidManifest.xml
中添加
configChanges
属性:

<application
    ...>
    <activity
        android:name=".YourActivity"
        ...
        android:configChanges="uiMode"/>
</application>
public class YourActivity extends AppCompatActivity {

    protected Configuration mPrevConfig;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        mPrevConfig = new Configuration(getResources().getConfiguration());
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        configurationChanged(newConfig);
        mPrevConfig = new Configuration(newConfig);
    }

    protected void configurationChanged(Configuration newConfig) {
        if (isNightConfigChanged(newConfig)) { // night mode has changed
            recreate();
            // do your thing
        }
    }

    protected boolean isNightConfigChanged(Configuration newConfig) {
        return (newConfig.diff(mPrevConfig) & ActivityInfo.CONFIG_UI_MODE) != 0 && isOnDarkMode(newConfig) != isOnDarkMode(mPrevConfig);
    }
    public static boolean isOnDarkMode(Configuration configuration) {
        return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
    }
}