いつもAlarmMangerには悩まされるのので、再度調べてみたときの備忘録。。version追従辛い。。
AlarmManagerで設定するサンプル
Context context = ....; // AlarmManagerを取得する AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // Alarmのタイプ int type = AlarmManager.RTC_WAKEUP; // Alarmの開始日時 long triggerAtMills = Calendar.getInstance().getTimeInMillis(); // Alarmの繰り返し間隔 long intervalMills = AlarmManager.INTERVAL_DAY; // Alarmの発火時に発行するIntent int requestCode = 0; Intent intent = new Intent(context, MyService.class); int flags = PendingIntent.FLAG_UPDATE_CURRENT; PendingIntent operation = PendingIntent.getService(context, requestCode, intent, flags); // AlarmManagerに登録する alarmManager.setRepeating(type, triggerAtMillis, intervalMillis, operation); // AlarmManagerから削除する alarmManager.cancel(operation);
Alarmのタイプ
// 時刻 int type = AlarmManager.RTC; // RTC + 実機スリープ中にはWAKE UP int type = AlarmManager.RTC_WAKEUP; // スリープ時間を含んだブートアップからの経過時間 int type = AlarmManager.ELAPSED_REALTIME; // ELAPSED_REALTIME + 実機スリープ中にはWAKE UP int type = AlarmManager.ELAPSED_REALTIME_WAKEUP;
Alarmの繰り返し間隔
// あらかじめ定数がいろいろ用意されているので、好きにつかう long intervalMillis = AlarmManager.INTERVAL_FIFTEEN_MINUTES; long intervalMillis = AlarmManager.INTERVAL_HALF_HOUR; long intervalMillis = AlarmManager.INTERVAL_HOUR; long intervalMillis = AlarmManager.INTERVAL_HALF_DAY; long intervalMillis = AlarmManager.INTERVAL_DAY;
PendingIntentのflags
// PendingIntent存在しない場合, 新規作成せず、NULLを返す。 int flags = PendingIntent.FLAG_NO_CREATE; // PendingIntentが存在する場合, IntentのExtra Dataを更新する。 int flags = PendingIntent.FLAG_UPDATE_CURRENT; // PendingIntentが存在している場合, 一度キャンセルしてから新規作成する。 int flags = PendingIntent.FLAG_CANCEL_CURRENT; // PendingIntentがただ一度のみ使われるときに利用する. int flags = PendingIntent.FLAG_ONE_SHOT;
PendingIntentの作成方法
// Service Intent intent = new Intent(context, MyService.class); PendingIntent operation = PendingIntent.getService(context, requestCode, intent, flags); // Broadcast Reciever Intent intent = new Intent(context, MyReciever.class); PendingIntent operation = PendingIntent.getBroadcast(context, requestCode, intent, flags); // Activiy Intent intent = new Intent(context, MyActivity.class); PendingIntent operation = PendingIntent.getActivity(context, requestCode, intent, flags);
AlarmManagerへの登録
~ API 18(Android 4.3)
// *** ~ API 18(Android 4.3) // 単発アラーム alarmManager.set(type, triggerAtMillis, operation); // 繰り返しアラーム alarmManager.setRepeating(type, triggerAtMillis, intervalMillis, pendingIntent);
API 19(Android 4.4) ~ API 22(Android 5.1)
// *** API 19(Android 4.4) ~ API 22(Android 5.1) // 単発アラーム alarmManager.set(type, triggerAtMillis, operation); // おおまかなアラーム alarmManager.setExact(type, triggerAtMillis, operation); // 正確なアラーム // 繰り返しアラーム alarmManager.setRepeating(type, triggerAtMillis, intervalMillis, pendingIntent); // 正確なアラーム alarmManager.setInexactRepeating(type, triggerAtMillis, intervalMillis, operation); // おおまかなアラーム alarmManager.setWindow(type, triggerAtMillis, intervalMillis, operation); //設定したWindow内の正確なアラーム
API 23(Android 6.0) ~
// *** API 23(Android 6.0) ~ // 単発アラーム alarmManager.set(type, triggerAtMillis, operation); alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation); // Doze中でも発火 alarmManager.setExact(type, triggerAtMillis, operation); alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation); // Doze中でも発火 // 繰り返しアラーム alarmManager.setRepeating(type, triggerAtMillis, intervalMillis, pendingIntent); alarmManager.setInexactRepeating(type, triggerAtMillis, intervalMillis, operation); alarmManager.setWindow(type, triggerAtMillis, intervalMillis, operation);
AlarmManagerの登録情報を確認
$ adb shell dumpsys alarm
以上!!