【问题标题】:How to cancel this repeating alarm?如何取消此重复警报?
【发布时间】:2011-03-20 19:41:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: android alarm


    【解决方案1】:

    AlarmManager 上调用cancel(),并使用与setRepeating() 相同的PendingIntent

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

    【讨论】:

    • 我想在用户看到通知后取消此警报,但通知是在 onReceive 中定义的。那么在取消警报之前,如何确定用户是否知道我的主要活动中的通知?谢谢
    • @Wen:使用与启动器不同的 Intent(例如,不同的操作)从 Notification 开始您的主要活动。或者,如果您将主要活动的现有实例带到前台,您的通知将在活动中触发 onNewIntent(),因此您可以在那里取消警报。
    • 通知会触发另一个活动。使用差异 Intent 从通知启动活动而不是用于启动器是什么意思?
    • @Wen:“通知将触发另一个活动。”。好的,然后将您的取消警报代码放入该活动的onCreate()
    • 没有这样的Flag,它的值为0。那你为什么在getBroadcast()中使用那个标志呢?
    【解决方案2】:

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

    【讨论】:

      【解决方案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 的相同ID。在我的代码中,我从 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();
      

      【讨论】:

      • 我正在尝试使用您上面列出的类似代码在第二个活动中取消通知。但是Android Studio说“非静态字段“mContext”不能从静态上下文中引用。而且“mContext = MainActivity.this;”也抛出错误。关于如何纠正的任何想法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多