特定の期間の後に X タスクを実行AlarmManager
するようにスケジュールするために、私は で遊んでいます。IntentService
これまでのところ、うまく機能しています。
public static void scheduleNextRefresh (final Context context, long msFromNow) {
Constants.logMessage("Scheduling fetcher alarm to happen within: " + msFromNow/(1000*60) + " minutes");
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra(AlarmReceiver.EXTRA_ACTION, AlarmReceiver.FETCH_NEWS);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (msFromNow != -1) {
Constants.logMessage("Alarm set");
alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + msFromNow, pendingIntent);
}
}
これまでのところ、うまく機能しています。ただし、通常は 30 分または数時間などの短い間隔しか使用しません。
数日後にアクションを実行するようにスケジュールを設定したいと考えています。それが で適切に機能するかどうか、または別のツールを使用して X 時間AlarmManager
に を送信する方が簡単かどうかに興味があります。PendingIntent
最小の間隔は 3 日であり、その過程で数回の再起動が発生する可能性があるため (私自身、少なくとも 1 日に 1 回は電話を再起動することを知っています)、それがどれほど実用的かはわかりませんAlarmManager
。
まず、私が使用している更新をスケジュールするロジックは上記と同じですが、唯一の違いは、必要に応じてアラームBroadcastReceiver
をリッスンしandroid.permission.RECEIVE_BOOT_COMPLETED
て再スケジュールするためにコードを追加したことです。
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
...some other code
else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Constants.logMessage("Re-scheduling alarms after boot completed");
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
//get the current interval we are using for cleanups
long alarmInterval = Long.valueOf(mPreferences.getString("pref_key_ccleaner_interval", "259200000"));
//get the last time in miliseconds that we set an alarm
//Whenever I schedule an alarm in the IntentService
//I store the time in ms to know when it was last scheduled
long lastAlarm = mPreferences.getLong(CacheCleaner.KEY_LAST_ALARM, 0);
if (lastAlarm == 0) {
//If no previous alarm is set, schedule it normally
CacheCleaner.scheduleNextCleanup(context, alarmInterval);
}
else {
//If there was an alarm set previously
//The difference between the alarmInterval and the amount of ms ellapsed since last alarm
//is the new time we will schedule this for
CacheCleaner.scheduleNextCleanup(context, (alarmInterval - (System.currentTimeMillis() - lastAlarm)));
}
}
それはうまくいくと思いますが、再スケジュールや他のイベントを心配することなく、今から数日後にイベントをスケジュールするより良い方法があることに興味があります.
何か案は?