无法从AlarmManager取消警报

时间:2014-02-25 13:09:48

标签: java android alarmmanager

我有一个AlarmManager,每隔10秒通知我一次。一切正常,但由于某种原因,我无法取消警报。这是我的代码。

public class AlarmNotifReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent)
{
//things
}

public void SetAlarm(Context context)
{
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, AlarmNotifReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10*1000, pi); // Millisec * Second
}

public void CancelAlarm(Context context)
{
    Intent i = new Intent(context, AlarmNotifReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    am.cancel(pi);
}


}

正如预期的那样,我从其他课程中调用这个CancelAlarm()方法但由于某种原因它不会取消并且一直没有通知我。 注意:SetAlarm()也可以正常使用。

提前致谢。

5 个答案:

答案 0 :(得分:1)

尝试取消Pendingintent--

PendingIntent.getBroadcast(context, 0, intent, 
                           PendingIntent.FLAG_UPDATE_CURRENT).cancel();

希望这有帮助

答案 1 :(得分:1)

应该在相同的待定意图上创建和取消警报。在您的情况下,您将创建待定意图两次。

您的代码应如下所示。

public class AlarmNotifReceiver extends BroadcastReceiver {

    PendingIntent pi;
    AlarmManager am;
    Intent i;

    @Override
    public void onReceive(Context context, Intent intent) {
        pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        i = new Intent(context, AlarmNotifReceiver.class);
        //things
    }

    public void SetAlarm(Context context) {

        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10 * 1000, pi);
    }

    public void CancelAlarm(Context context) {
        am.cancel(pi);
    }


}   

答案 2 :(得分:0)

试试这个

public class AlarmNotifReceiver extends BroadcastReceiver {

AlarmManager am = null;

 @Override
 public void onReceive(Context context, Intent intent)
{
 Intent i = new Intent(context, AlarmNotifReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
//things
}

public void SetAlarm(Context context)
{
am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10*1000, pi); // Millisec * Second
}

public void CancelAlarm(Context context)
 {

am.cancel(pi);
}


}

答案 3 :(得分:0)

试试这个。

Android: Get all PendingIntents set with AlarmManager

要取消所有警报,首先您必须找到所有待处理的意图并使用该警告取消警报。

如果它对您有帮助,请不要错过接受此作为您的答案。

答案 4 :(得分:0)

您的问题是您正在创建新意图而不是取消现有意图。函数SetAlarm应将intent放入“global”变量,而CancelAlarm函数应该只调用     am.cancel(global_pi);

上述服务对我有用,但是:

如果这是不可能的(因为那是接收器),请尝试首先使用(新)意图设置新警报。