学生用のアプリケーションでバックグラウンドサービスにマークをダウンロードし、前回よりも多くのマークがあるかどうかを確認します。新しいマークがある場合は通知をプッシュし、sharedPreferencesにマークの数を書き換えます。それは動作しますが、同時に同じマークの通知が複数同時にを作成します。AndroidサービスsetInexactRepeating SharedPreferencesを使用したasyncTaskの問題
放送受信トリガIntentService:
public int onStartCommand(Intent intent, int flags, int startId) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(getApplicationContext(), CheckNewMarksReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
alarmManager.setInexactRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
0,
2500, alarmIntent);
return START_STICKY;
}
放送受信onReceive方法はsharedPreferences属性初期化numberOfMarksSavedとはAsyncTaskを開始し、そのダウンロードデータ:
DownloadDataTask task = new DownloadDataTask();
task.execute(context.getString(R.string.LOGIN_PAGE_URL), username, password);
dataPreferences = context.getApplicationContext().getSharedPreferences(context.getString(R.string.SHARED_PREFERENCES), Context.MODE_PRIVATE);
numberOfMarksSaved = dataPreferences.getInt(context.getString(R.string.PREFERENCE_NUMBER_OF_MARKS_KEY), -1);
AsyncTasks onPostExecuteの方法チェックダウンロードマークの数が前回よりも大きい場合:私が言ったように、
if (numberOfDownloadedMarks > numberOfMarksSaved) {
...
notifyUserAbout(newMarks, response); // method to fire a notification
}
dataPreferences
.edit()
.putInt(context.getString(R.string.PREFERENCE_NUMBER_OF_MARKS_KEY),
numberOfDownloadedMarks)
.apply();
これはほとんど動作し、時にはBroadcastReceiverは直ちに2回連続をトリガさ - 最初の値を書き換えますsharedPreferencesでは2番目の値は共有環境設定の値が変更されたことを「認識」しません。どうすればそれを防ぐことができますか?
EDIT: 私もsetInexactRepeatingの代わりにsetRepeatingない試してみました - 何も変更された(私はアンドロイドalarmManager時間シフトを疑います)。ここに私のログは次のとおりです。
06-11 18:14:14:
06-11 18新しいデータをダウンロード:27.761 ...私は/ジャストに約27.732 ... I /ジャスト約: 14::新しいデータに
06-11 18をダウンロード27.907 ... I /保存&新しい:89、90
06-11 18:14:27.933 ... I /通知が焼き - ID:1077819997
06-11 18:14:28.004 ... I/Saved &新規:89,90
06-11 18:14:28.006 ... I /通知焼き - ID:1077820069
inexactRepeatingから繰り返すように変更されたという回答がありました。それは助けになりませんでした。 – cuddlecheek