web-dev-qa-db-ja.com

この繰り返しアラームをキャンセルするには?

ユーザーへのリマインダーのようなものを書いています。ユーザーはイベントのリマインダーを設定します。時間が来ると、アラームが繰り返し設定されてステータスバー通知がトリガーされます。しかし、通知を選択するか、通知をクリアした後、アラームは止まらないようです。この繰り返しアラームをキャンセルする場所がわかりません。以下にコードの一部を示します。メインアクティビティで繰り返しアラームを設定する

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);

ユーザーが通知を選択またはクリアしたときにアラームを停止するにはどうすればよいですか?

34
Wen

cancel()で使用したものと同等のAlarmManagerを使用して、PendingIntentsetRepeating()を呼び出します。

Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.cancel(sender);
79
CommonsWare

私はさまざまな方法を試してみましたが、機能させることができなかったため、汚いトリックを行うことにしました。繰り返し発生するアラームをキャンセルする場合は、アラームを作成したのと同じ方法を使用し(したがって古いアラームを置き換えます)、すぐにキャンセルします。このメソッドでは、ブール変数が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);
    }
4

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();
_
3
Sunil Chaudhary