毎日午後 2 時 30 分から午後 4 時 30 分まで、繰り返しアラームの開始時刻と終了時刻をユーザーに設定させます。指定した開始時間にアラームを鳴らすように設定できますが、終了時間にアラームを停止するにはどうすればよいですか?
余分なものを取得してシステム時間と比較する Broadcast Receiver クラスでこれを処理する必要があると思いますが、アクティビティでキャンセルする方法でアラームをキャンセルすることはできません。
これは、アラームを設定する方法の例です。
Intent intent = new Intent(NewSchedule.this, RepeatingAlarm.class);
intent.putExtra("endTime", cal_alarmend.getTimeInMillis()/1000);
PendingIntent sender = PendingIntent.getBroadcast(NewSchedule.this, REQUEST_CODE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal_alarmstart.getTimeInMillis(), 6000, sender);
受信者クラス:
public class RepeatingAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "repeating_received", Toast.LENGTH_SHORT).show();
long now = System.currentTimeMillis();
Bundle b = intent.getExtras();
long end = b.getLong("endTime");
Log.i("now", now + "");
Log.i("end", end + "");
if (now > end)
{
???????
}
}
}
編集
BroadcastReceiver の onReceive() でアラームをキャンセルできないのはなぜですか?
public class RepeatingAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "repeating_received", Toast.LENGTH_SHORT).show();
long now = System.currentTimeMillis();
Bundle b = intent.getExtras();
long end = b.getLong("endTime");
int rc = b.getInt("reqCode");
Log.i("rc", rc + "");
long n = now/1000;
long e = end;
Log.i("now", n + "");
Log.i("end", e + "");
if (n > e)
{
Log.i("STATUS", "now > end " + n + ">" + e);
Intent intentstart = new Intent();
PendingIntent senderstart = PendingIntent.getBroadcast(context, rc, intentstart, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.cancel(senderstart);
}
else
{
Log.i("STATUS", "now <= end " + n + "<=" + e);
}
}
}
スタックトレースを再確認したところ、rc は、アラームを開始するために使用した要求コードとまったく同じです。
これはスタックトレースです:
この後、アラームはキャンセルされたはずですが、まだトースト メッセージが表示されます。