Arka planda hizmet olarak çalışmak istediğiniz Service
türetilmiş aşağıdaki kod var. Bu sınıfta, paylaşılan bir tercihin değişip değişmediğini kontrol etmek için SharedPreferences.OnSharedPreferenceChangeListener
sınıfını kullanıyorum, BroadcastReceiver
tanımlanmış zaman aralıklarında (her 6 saatte bir) çalıştırılacak. Ancak, ana etkinliğimde açıkça paylaşılan tercihi 3 saate değiştirdiğimde, kodun 3 saat içinde çalıştırılmasına ihtiyacım var (6 saat yerine)."Gerçek bağımsız değişken <anonim OnSharedPreferenceChangeListener> yöntemi, yöntem çağırma dönüşümü ile Bağlam dönüştürülemez"
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
}
Ama kod derleme, aşağıdaki elde:
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
türetilmiş bir sınıf de tanımlandığı gibi uygulanan yöntem şu şekildedir: Burada Service
kodudur hata:
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
Hatanın gerçekleştiği yer yukarıda işaretlenmiştir. Bir kez daha, hala anlamak için 'bağlam', bir kavramla ilgili bir hata başarısız am olsun ...
Özellikle gerçeği ile şaşkın, çağrı kodu aşağıda o detayli
alarm.SetAlarm(this);
iyi çalışıyor. Belki de sorun bir iç sınıfın kullanımı yüzünden mi?
Bunu nasıl düzeltebilirim? Ya da bütün kodu düzeltmek mi? Örnek kod koydum ve bu iyi bir android kodu olup olmadığından emin değilim ...
de diğer sorunu gidermek cevabını Güncelleme okuyun. –
aslında küresel bir sharedPref gerekmez, ama emin ... Anlıyorum – Alex
doğru bir fikrim yok. Ayrıca bir şey haline aday olabileceğini farkında olmak açıklanan davranıştır [buradan] (http: // stackoverflow.com/a/3104265/1435985) bir "OnSharedPreferenceChangeListener" öğesini güçlü bir başvuru kaynağı olmadan kaydetme hakkında. –