ユーザーへのリマインダーのようなものを書いています。ユーザーはイベントのリマインダーを設定します。時間が来ると、アラームが繰り返し設定されてステータスバー通知がトリガーされます。しかし、通知を選択するか、通知をクリアした後、アラームは止まらないようです。この繰り返しアラームをキャンセルする場所がわかりません。以下にコードの一部を示します。メインアクティビティで繰り返しアラームを設定する
alarmTime = Calendar.getInstance();
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmTime.add(Calendar.MINUTE,offset_time);
//Schedule the alarm
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), 30 * 1000, sender);
OnReceiveメソッドでは、通知をステータスバーに表示し、フラグをFLAG_AUTO_CANCEL
manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.medical, text, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0);
notification.flags = Notification.FLAG_AUTO_CANCEL;
manager.notify(R.string.service_text, notification);
ユーザーが通知を選択またはクリアしたときにアラームを停止するにはどうすればよいですか?
cancel()
で使用したものと同等のAlarmManager
を使用して、PendingIntent
でsetRepeating()
を呼び出します。
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(sender);
私はさまざまな方法を試してみましたが、機能させることができなかったため、汚いトリックを行うことにしました。繰り返し発生するアラームをキャンセルする場合は、アラームを作成したのと同じ方法を使用し(したがって古いアラームを置き換えます)、すぐにキャンセルします。このメソッドでは、ブール変数がtrueに設定されている場合、アラームフローを作成して置き換え、同じIDを持つ置き換えをキャンセルします。
static void CancelRepeatingAlarm(Context context, boolean creating){
//if it already exists, then replace it with this one
Intent alertIntent = new Intent(context, AlertReceiver.class);
PendingIntent timerAlarmIntent = PendingIntent
.getBroadcast(context, 100, alertIntent,PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (creating){
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), INTERVAL, timerAlarmIntent);
}else{
alarmManager.cancel(timerAlarmIntent);
}
MainActivity
で、アラーム時間を設定します。複数のアラームを使用する場合は、SharedPreferences
を使用してそれぞれのIDを保存します。コードは次のとおりです。
_PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
pendingIntent);
public static Context getContext() {
return mContext;
}
mContext=mainactivity.this;
_
2番目のActivity
では、SharedPreferences
と同じIDを使用します。私のコードでは、ArrayList、_Alarm_id
_からIDを取得します。最後に、ここでMainActivityコンテキストをMainActivity.getContext()
で使用できます。コードは次のとおりです。
_AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intentAlarm = new Intent(AlarmListviewActivity.this,
MainActivity.class);
PendingIntent morningIntent = PendingIntent.getBroadcast(MainActivity.getContext(), Alarm_id.get(positon),
intentAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(morningIntent);
morningIntent.cancel();
_