优化夜间模式系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化夜间模式系统相关的知识,希望对你有一定的参考价值。

我在我的应用中创建了一个昼夜模式切换系统。目前,我使用PreferenceFragmentCompat + SharedPreference来显示和保存开关选择。

这是我的代码。

public class PreferencesActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preferences);

        PreferencesFragment preferencesFragment = new PreferencesFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.preferences_container, preferencesFragment).commit();

    }


    public static class PreferencesFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }


        @Override
        public void onResume() {
            super.onResume();
            getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            if (isAdded()) {
                if (sharedPreferences.getBoolean(getString(R.string.KEY_PREF_NIGHT_MODE), false)) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                } else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

                }
            }
        }
    }

}

除此之外,我在主Activity的OnCreate方法中使用了以下代码。

        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

        int mode = sharedPreferences.getBoolean(getString(R.string.KEY_PREF_NIGHT_MODE), false) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO;
        if (AppCompatDelegate.getDefaultNightMode() != mode)
            AppCompatDelegate.setDefaultNightMode(mode);

问题是当我激活黑暗模式并重启应用程序时 它将在onCreate方法中启动并重启。难道没有更优化的方法来实现这个系统吗?

答案

你可以创建 BaseActivity 其中您设置了夜间模式

abstract class BaseActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
    }
}

然后把你所有 ActivitesBaseActivity

public class PreferencesActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...
    }
}

那么你的夜间模式将在每一个活动之前被设置为 setContentView 而不会发生重启的情况

更新

变化

 @Override
 public void onResume() {
    super.onResume();
        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
 }

@Override
public void onStart() {
    super.onStart();
        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

onStart 在视图可见之前被调用

更新2

这里是访问的单体 SharedPreferences

public class SharedManager {

    private static SharedManager instance;
    private final SharedPreferences preferences;

    private SharedManager() {
        preferences = MyApplication.getAppContext().getSharedPreferences(Constants.PREF_NAME, Context.MODE_PRIVATE);
    }

    public static SharedManager getInstance() {
        if (instance == null) {
            synchronized (SharedManager.class) {
                if (instance == null) {
                    instance = new SharedManager();
                }
            }
        }
        return instance;
    }

    public SharedPreferences getPreferences() {
        return preferences;
    }
}

连呼 SharedManager.getInstance().getPreferences() 您可以访问偏好设置

以上是关于优化夜间模式系统的主要内容,如果未能解决你的问题,请参考以下文章

css HeiHei - 简单时尚的CSS片段,可以打开夜间模式。

Android 系统APK-闹钟 长按进入夜间模式,松开退出夜间模式

系统Android 10.0来袭:新增夜间模式,最大赢家是OLED手机用户?

Android记录24-WebView实现白天/夜间阅读模式

微信更新内测版,呼声已久的夜间模式终于上线了

四种爪机夜间模式的实现思路