我有以下代码派生自Service
我希望在后台运行作为服务。在这个类中,我使用SharedPreferences.OnSharedPreferenceChangeListener
类来检查共享首选项是否已更改,以便重新初始化BroadcastReceiver
以在某个定义的时间间隔(例如每6小时)运行一次。但是,当我将主活动中的显式共享首选项更改为3小时时,我需要在3小时内(而不是6小时)运行代码。以下是Service
的代码:
public class AlarmService extends Service
{
public Alarm alarm = new Alarm();
public SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
public void onCreate()
{
super.onCreate();
SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
// reinitialize the alarm
alarm.SetAlarm(this); // ERROR HERE
}
};
//SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
sharedPref.registerOnSharedPreferenceChangeListener(spChanged);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.d("!~!", "Service started.");
alarm.SetAlarm(this);
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}
方法SetAlarm
在派生自BroadcastReceiver
的类中定义,并按如下方式实现:
public void SetAlarm(Context context)
{
// get the update cylce from the prefences
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
int updateInterval = Integer.parseInt(sharedPref.getString("updateInterval", "24"));
Log.d(LOGHEAD, String.format("Alarm set to update every %d hours.", updateInterval));
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * updateInterval, pi); // Millisec * Second * Minute
}
但是当我编译代码时,我收到以下错误:
Error:(33, 26) error: method SetAlarm in class Alarm cannot be applied to given types;
required: Context
found: <anonymous OnSharedPreferenceChangeListener>
reason: actual argument <anonymous OnSharedPreferenceChangeListener> cannot be converted to Context by method invocation conversion
错误发生的位置标记在上方。我再次收到与“背景”相关的错误,这个概念,我仍然无法理解......
我特别感到困惑的是,下面的代码就是调用
alarm.SetAlarm(this);
工作正常。也许问题是因为使用了内部类?
任何想法如何解决这个问题?或修复整个代码?我已经将示例中的代码放在一起,我不确定这是不是很好的android代码...
答案 0 :(得分:0)
在该特定上下文中this
确实引用了OnSharedPreferenceChangeListener
,如错误消息中所示。
将this
替换为AlarmService.this
以引用外部服务实例,事情应该有效。
根据您的评论,您还需要初始化onCreate()
内的偏好设置。
首先只声明偏好
private SharedPreferences sharedPref;
然后在onCreate()
里面做
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
答案 1 :(得分:0)
在侦听器this
内部引用OnSharedPreferenceChangeListener
对象,该对象不扩展Context
类。您需要将有效的Context
对象传递给setAlarm
方法
但是,当您在onStartCommand中调用setAlarm时,this
代表您的AlarmService对象。
如需进一步参考 - 请阅读Oracle documentation