在通知区域切换中监听 "Dark Theme" 并收到更改通知

Listening on "Dark Theme" in notification area toggle and be notified of a change

我可以通过调用 resources.configuration.uiModeConfiguration.UI_MODE_NIGHT_MASK 获得 UI_MODE_NIGHT_MASK

我需要收听此变量并在收到新值时更改我的主题。

我想我可以添加一个 BroadcastReceiver 这样我就可以做一个 getSystemService(A_CONSTANT_FROM_Context) 并注册一个类似于 ConnectivityManager.NetworkCallback 的主题回调。但我只在文档中找到这些:在我的主题样式上扩展 Theme.MaterialComponents.DayNight 并具有 values-night。已接受答案的问题 参考此文档。

要了解有关 uiMode 更改的信息,请在 AndroidManifest.xml 中添加 configChanges 属性:

<application
    ...>
    <activity
        android:name=".YourActivity"
        ...
        android:configChanges="uiMode"/>
</application>

然后在您 activity 中监听配置更改:

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;
    }
}