Android - 首选项 API onSharedPreferenceChanged - 哪种方式正确?

Android - Preferences API onSharedPreferenceChanged - Which way is correct?

我正在使用 Preferences-API 在我的应用程序中实施设置。
我选择使用 PreferenceFragment.

我的 PreferenceFragment 包含我的 onSharedPreferenceChanged 代码。
但是,对于我的 Preferences 之一,我不确定要以何种方式实现我的目标。
目标是:基于 TogglePreference,启用或禁用我的 Receiver。

下面,我列出了我想做的 2 个不同的方法。
我对这两个例子的推理是 #1 不使用 findPreference(key) 而 #2 使用
所以我请求反馈 - 哪种方式是正确的?


public static final String PREF_GPS_STATE_LISTENER = "pref_gpsStateListener";

private SharedPreferences.OnSharedPreferenceChangeListener prefChangeListener;
...
...

prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged
        (SharedPreferences sharedPreferences, String key) {

if (key.equals(PREF_GPS_STATE_LISTENER)) {

    final PackageManager pacMan = 
        getActivity().getApplicationContext().getPackageManager();
    final ComponentName compLocationReceiver = new ComponentName
        ("com.studio2bdesigns.testapp021019", ".LocationReceiver");
    final SharedPreferences getPrefs = 
        PreferenceManager.getDefaultSharedPreferences(getActivity());

    if (getPrefs.getBoolean(PREF_GPS_STATE_LISTENER, true)) {

        //  ENABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    } else if (!getPrefs.getBoolean(PREF_GPS_STATE_LISTENER, true)) {

        //  DISABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    }
}
}

(OR) 这是正确的方法吗:


private SharedPreferences.OnSharedPreferenceChangeListener prefChangeListener;
...
...

prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged
        (SharedPreferences sharedPreferences, String key) {

if (key.equals(PREF_GPS_STATE_LISTENER)) {

    Preference gpsStateListenerPref = findPreference(key);

    final PackageManager pacMan = 
        getActivity().getApplicationContext().getPackageManager();
    final ComponentName compLocationReceiver = new ComponentName
        ("com.studio2bdesigns.testapp021019", ".LocationReceiver");

    if (gpsStateListenerPref.isEnabled()) {

        //  ENABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    } else if (!gpsStateListenerPref.isEnabled()) {

        //  DISABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    }
}
}

起初我认为选项 #1 是正确的 - 但我想出选项 #2 的原因是因为第一个例子 不使用 findPreference(key); - 这就是 keyonSharedPreferenceChanged 中传递的全部意义,不是吗?

非常感谢对此的反馈!谢谢!

该键用于将视觉控件与共享首选项相匹配。这确实是一个偏好问题。我更喜欢使用数字 1,因为我不依赖于某个视图,并且让共享偏好成为你的真实来源。