オクラホンでは、ユーザーが設定を切り替えることができるバックグラウンドの更新があります。ここで設定活動からのコードは次のとおりです。ユーザーは毎日のアラームを設定した場合AlarmManager RepeatingAlarmが2回以上発火しない
intent = new Intent(context, UpdateScoresService.class);
recurringDownloadDaily = PendingIntent.getService(context,0,intent, 0);
recurringDownloadWeekly = PendingIntent.getService(context, 1, intent, 0);
Preference.OnPreferenceChangeListener refreshListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if(newValue.toString().equals("1")){ /* daily */
background_refresh.setSummary("Scores will be refreshed daily.");
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.cancel(recurringDownloadDaily);
manager.cancel(recurringDownloadWeekly);
Log.e("DAILY REFRESH", " ");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,10);
calendar.set(Calendar.MINUTE,00);
if(calendar.before(Calendar.getInstance())){
Log.e("AFTER", "10 AM DAILY");
calendar.add(Calendar.DATE, 1);
}
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, recurringDownloadDaily);
}else if(newValue.toString().equals("2")){ /* weekly */
Log.e("WEEKLY REFRESH", " ");
background_refresh.setSummary("Scores will be refreshed weekly.");
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.cancel(recurringDownloadDaily);
manager.cancel(recurringDownloadWeekly);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,10);
calendar.set(Calendar.MINUTE,00);
if(calendar.before(Calendar.getInstance())){
Log.e("AFTER", "10 AM WEEKLY");
calendar.add(Calendar.DATE, 1);
}
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, recurringDownloadWeekly);
}else{ /* manually */
background_refresh.setSummary("Scores will be refreshed manually.");
Log.e("MANUAL REFRESH", " ");
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.cancel(recurringDownloadDaily);
manager.cancel(recurringDownloadWeekly);
}
return true;
}
};
background_refresh.setOnPreferenceChangeListener(refreshListener);
、私はそれが午前10時に毎朝リフレッシュすることを期待しています。 テストの場合、翌日に日付を設定して時刻を午前9:59に設定すると、アラームは約10AM発生します。また、電話で手動で日付と時刻を変更し続けることができ、毎回起動します。しかし、もし私がオプションを設定して翌日まで待つだけであれば、警報が発射されても発射されなくてもかまいません。私はそれ以上に頻繁に起こることはないと感じています。
public void onReceive(Context context, Intent intent) {
Log.e("Boot reciever", "a");
if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
// Toast.makeText(context, "Boot Reciever", Toast.LENGTH_SHORT).show();
Log.e("Boot reciever", "b");
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
intent1 = new Intent(context, UpdateScoresService.class);
recurringDownload = PendingIntent.getService(context,0,intent1, 0);
String refreshRate = sharedPreferences.getString("background_refresh", "1");
if(refreshRate.equals("1")){ /* daily */
daily(context);
}else if(refreshRate.equals("2")){ /* weekly */
weekly(context);
}else { /* manually */
manually(context);
}
}
}
public void daily(Context context){
Log.e("DAILY REFRESH", "BRUH!");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,10);
calendar.set(Calendar.MINUTE,00);
if(calendar.before(Calendar.getInstance())){
Log.e("AFTER", "10 AM WEEKLY");
calendar.add(Calendar.DATE, 1);
}
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, recurringDownload);
}
public void weekly(Context context){
Log.e("WEEKLY REFRESH", "BRUH!");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,10);
calendar.set(Calendar.MINUTE,00);
if(calendar.before(Calendar.getInstance())){
Log.e("AFTER", "10 AM WEEKLY");
calendar.add(Calendar.DATE, 1);
}
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 7, recurringDownload);
}
public void manually(Context context){
Log.e("MANUAL REFRESH", "BRUH!");
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.cancel(recurringDownload);
}
をそして限り、私はこれを言うことができるようにように動作するようです:
私はまた、デバイスはデバイスがオフになって、背面にした後にアラームを再スケジュールするために起動が完了したときを知るには、このコードを持っていますもし私が9時55分に電話を切って、それをバックアップしても、サービスはまだ動いています。
問題は、次の日または日に実行されていないことです。なぜ、サービスがバックグラウンドで殺されているのかは分かりません。私はMainActivityのonResumeに同じコードを追加してアラームを再スケジュールすることを考えていましたが、それは少し過度に思え、それを行わずに一貫して実行できるはずです。ポイント下回っ
私はそれを変えることは間違いありません。 2の場合、データベースを使用して変更を記録するので、データベースにバックアップを作成します。この種のテストでは、変更されたデータベースをバックアップされたデータベースに置き換えます。 3については、私は間違いなくそれを忘れてしまった。 – user2923535