36

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

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

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

4

3 回答 3

83

使用与您使用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);
于 2010-07-25T19:56:40.707 回答
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);
    }
于 2016-11-15T06:14:33.163 回答
3

在您的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;

在您第二次Activity使用来自SharedPreferences. 在我的代码中,我从 ArrayList 中获取 ID Alarm_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();
于 2015-06-26T06:27:07.363 回答