通过 SwitchPreference 启动服务

Starting a service via a SwitchPreference

谁能告诉我如何在 PreferenceScreen 中的 SwitchPreference 切换时 start/stop 定位服务(或任何其他服务)on/of? 我正在使用 settingsFragemnt(扩展 PreferenceFragemntCompat),它托管在我的设置 activity.

您应该添加 OnPreferenceChangeListener 以允许您监听开关变化:

   final SwitchPreference onOffRandomColor = (SwitchPreference) findPreference(this.getResources()
                                                    .getString(R.string.sp_key_on_off_random_color));

        onOffRandomColor.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object o) {
                if(onOffRandomColor.isChecked()){

                }else {

                }
                return false;
            }
        });

下一步是 运行 服务:

startService(new Intent(this, LocationService.class));

我的片段看起来像这样:

public class SettingsFragment extends PreferenceFragmentCompat {

@Override
public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey){
    setPreferencesFromResource(R.xml.prefs, rootKey);

    // setting summaries for both list preferences ---------------------------------------------
    ListPreference photo_quality = findPreference("photo_quality");
    if (photo_quality != null){
        photo_quality.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
    }

    ListPreference uploads = findPreference("upload_options");
    if (uploads != null) {
        uploads.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
    }

    // setting the visibility for location service ---------------------------------------------
    if (!Auth.getCanDeactiveGps()){
        Objects.requireNonNull(getPreferenceScreen()
                .findPreference("location_category")).setVisible(false);
    }

    // handling locationSwitchPreference change ------------------------------------------------
    SwitchPreference locationSwitch = findPreference("location");

    if (locationSwitch != null){
        locationSwitch.setChecked(Settings.getBoolean(Settings.DO_NOT_LOCATE,
                false));

        locationSwitch.setOnPreferenceChangeListener(
                new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Settings.setBoolean(Settings.DO_NOT_LOCATE, true);
                return false;
            }
        });
    }
}