1

我正在提供服务,所以我有从服务扩展而来的服务类。我从 PreferenceScreen 获得一个复选框,并根据它是否被选中执行操作。要获得 CheckBoxPreference,我使用 getPreferenceManager() 方法。但它有红色下划线。当我将鼠标悬停在它上面时,我会看到这个错误The method getPreferenceManager() is undefined for the type BatteryService。当我在我的主类中使用相同的代码时,它就可以工作了。这是我的代码

public int onStartCommand(Intent intent, int flags, int startId) {
    initNotification();

    final CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager().findPreference("cbAlarm");

    checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                public boolean onPreferenceChange(Preference preference,
                        Object newValue) {
                    if (newValue.toString().equals("true")) {
                        Toast.makeText(getApplicationContext(), "Service Started", Toast.LENGTH_LONG).show();
                        registerReceiver(batteryInfoReceiver, new IntentFilter(
                                Intent.ACTION_BATTERY_CHANGED));
                    } else if (newValue.toString().equals("false")) {
                        stopService(new Intent(getBaseContext(),
                                BatteryService.class));
                        Toast.makeText(getApplicationContext(),
                                "Unchecked", Toast.LENGTH_SHORT).show();
                    }
                    return true;
                }
            });
    return START_STICKY;
}

我怎么解决这个问题?请帮忙

4

1 回答 1

3

getPreferencesManager()函数不适用于Service派生对象 - 仅适用于您可能从中复制上述代码的 PreferenceActivity 或 PreferenceFragment 派生对象,或单个 Preference 对象。

如果您只想在服务启动时对复选框首选项的值进行采样,请使用以下内容:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
boolean alarm = sp.getBoolean("cbAlarm", false);    // defaulting to false

但是,我从您的侦听器代码中猜测,如果用户更改设置,您也希望收到通知。这意味着将 onPreferenceChange 保留在 PreferenceActivity/PreferenceFragment 中,并向服务发送消息。为此,请考虑使用Android 之类的最佳方式从 Activity 到 Service / Engine 进行通信,或者如果在警报关闭时它无事可做,则只需启动/停止整个服务!

于 2013-02-20T22:27:42.150 回答