読者です 読者をやめる 読者になる 読者になる

【Android】PendingIntent+AlarmManagerで目覚まし時計をつくる

 

目覚まし時計の仕組みを

PendingIntent+AlarmManager を使用してつくってみます。

 

f:id:stanleyblenz:20161106012802p:plain

 

-------------------------------------------------------------------------------------------

// 目覚まし時間を定義
TimeZone tz = TimeZone.getTimeZone("Asia/Tokyo");
Calendar cal = Calendar.getInstance();
cal.setTimeZone(tz); //タイムゾーン設定しないとALertManagerで即座実行される
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(str時)); ※時間指定
cal.set(Calendar.MINUTE, Integer.parseInt(str分));              ※分指定
cal.set(Calendar.SECOND, 0);                                             ※秒指定

 

// 現在時刻のカレンダーインスタンス作成
Calendar cal_now = Calendar.getInstance();
cal_now.setTimeZone(tz);

 

//PendingIntent+AlarmManagerの準備

int id = 0; //idはどのサービスかを区別する為のもの
Context context = this.cordova.getActivity().getApplicationContext();
Intent intent = new Intent(context, SubActivity.class);
PendingIntent sender = PendingIntent.getActivity(

                context,
                id,
                intent,
                PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager mng = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

 

//アラームを設定する場合

if ("1".equals(onoff)) {
  long target_ms = cal.getTimeInMillis();
  long now_ms = cal_now.getTimeInMillis();
  if (target_ms >= now_ms) {

      //アラーム指定時間が現在時刻前の場合、何もしない

  } else {
    cal.add(Calendar.DAY_OF_MONTH, 1); //過ぎていたら明日の同時刻を指定
  }
  mng.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

//アラームをキャンセルする場合
} else {
  mng.cancel(sender);
}

-------------------------------------------------------------------------------------------

既存のPendingIntentがあればキャンセルして新しいPendingIntentを実行

PendingIntent.FLAG_CANCEL_CURRENT

既存のPendingIntentがあればextraのデータだけ置き換え
PendingIntent.FLAG_UPDATE_CURRENT 

時刻で指定

AlarmManager.RTC

時刻で指定(スリープの場合電源ON)
AlarmManager.RTC_WAKEUP

電源ON時からの経過時間
AlarmManager.ELAPSED_REALTIME

電源ON時からの経過時間(スリープの場合電源ON)
AlarmManager.ELAPSED_REALTIME_WAKEUP

 

-------------------------------------------------------------------------------------------

<補足>

mng.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

はただセットしているだけのため、リピートはしません。

(アラームが指定時間に起動しますが、翌日の同時刻には起動しません)

※以前は、setRepeatingというものがありましたが、非推奨になりました。

 

そのため、アラームを起動したタイミングで、

再度、アラームの再設定をする必要があります。