如何取消此重复警报?

Wen*_*Wen 34 android alarm

我正在写一些类似用户的提醒.用户将为其事件设置提醒,当时间到来时,将设置重复警报以触发状态栏通知.但是在我选择通知或清除通知后,警报似乎不停.我不知道在哪里取消这个重复闹钟.以下是一些代码:在我的主要活动中设置重复警报

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);
Run Code Online (Sandbox Code Playgroud)

在我的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);
Run Code Online (Sandbox Code Playgroud)

当用户选择通知或清除通知时,如何停止警报?

Com*_*are 79

调用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);
Run Code Online (Sandbox Code Playgroud)

  • 我希望在用户看到通知后取消此警报,但通知在onReceive中定义.那么在取消警报之前,如何确定用户是否知道我的主要活动中的通知?谢谢 (3认同)
  • @Wen:使用不同的Intent(例如,不同的动作)从Notification启动主活动而不是用于启动器.或者,如果要将主活动的现有实例带到前台,则通知将在活动中触发onNewIntent(),因此您可以在那里取消警报. (2认同)

Ram*_*deh 5

我尝试了各种方法都无法奏效,所以我决定做一个肮脏的把戏。当我想取消重复闹钟时,我会使用创建闹钟的相同方法(因此替换旧闹钟),然后立即取消。使用此方法,如果布尔变量设置为 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);
    }
Run Code Online (Sandbox Code Playgroud)