くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

AndroidのAlarmManagerに再度入門する

いつも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

以上!!

参考にしたサイト様