私は、サービスとして実行するService
から次のコードをバックグラウンドで取得しています。このクラスでは、SharedPreferences.OnSharedPreferenceChangeListener
クラスを使用して、共有の設定が変更されているかどうかを確認して、BroadcastReceiver
を一定の時間間隔(6時間ごとなど)で再起動するように再初期化します。しかし、主なアクティビティの明示的な共有設定を3時間に変更すると、コードを3時間(6時間ではなく)で実行する必要があります。ここでService
のコードされています"実際の引数<匿名のOnSharedPreferenceChangeListener>をメソッド呼び出し変換によってコンテキストに変換できません"
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
エラーが発生した場所は上記のとおりです。もう一度、私は「文脈」に関連したエラー、コンセプトを取得し、私はまだ理解して失敗しています...
私は特に、コードの下にそのfutherコール
alarm.SetAlarm(this);
、事実によって当惑しています
は問題なく動作しています。おそらく問題は内部クラスの使用によるものでしょうか?
これを修正する方法はありますか?または、コード全体を修正しますか?私は例からのコードをまとめました。これが良いアンドロイドコードであるかどうかはわかりません。
他の問題にも対処するための回答が更新されました。 –
実際には、グローバルなsharedPrefは必要ありませんが、あなたは正しいアイデアを持っていると確信しています... – Alex
私は参照してください。また、あなたが遭遇する可能性があることに気づくべきことは、[here](http:// stackoverflow。'OnSharedPreferenceChangeListener'を強く参照せずに登録することについての情報を提供しています(com/a/3104265/1435985)。 –