【问题标题】:AlarmManager - deleting/checking alarms not workingAlarmManager - 删除/检查警报不起作用
【发布时间】:2014-05-16 01:36:15
【问题描述】:

我想做以下事情:

1) 取消闹钟

2) 检查是否存在报警...

为了对此进行测试,我执行以下操作:

 public static void startUpdater(Context context)
{
    // START TEST CODE
    cancelAllAlarms(context);
    alarmExists(context);
    // END TEST CODE

    if (true)// !alarmExists(context))
    {
        AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pi = getAlarmPendingIntent(context);

        Calendar calNextAlarm = Calendar.getInstance();
        calNextAlarm.set(Calendar.HOUR, 12);
        calNextAlarm.set(Calendar.MINUTE, 0);
        calNextAlarm.set(Calendar.SECOND, 0);
        calNextAlarm.set(Calendar.MILLISECOND, 0);

        L.d(Updater.class, "Alarm wird registriert..." + calNextAlarm.getTime().toLocaleString());

        mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                calNextAlarm.getTimeInMillis(),
                86400000, // repeat once a day
                pi);
    }
}

private static void cancelAllAlarms(Context context)
{
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent pendingUpdateIntent = getAlarmPendingIntent(context);
    try
    {
        alarmManager.cancel(pendingUpdateIntent);
        L.d(Updater.class, "AlarmManager canceled!");
    }
    catch (Exception e)
    {
        L.d(Updater.class, "AlarmManager update was not canceled. " + e.toString());
    }
}

private static Intent getAlarmIntent(Context context)
{
    return new Intent(context, AlarmReceiver.class);
}

private static PendingIntent getAlarmPendingIntent(Context context)
{
    return getAlarmPendingIntent(context, false);
}

private static PendingIntent getAlarmPendingIntent(Context context, boolean flagNoCreate)
{
    Intent i = getAlarmIntent(context);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, flagNoCreate ? PendingIntent.FLAG_NO_CREATE : 0);
    return pi;
}

private static boolean alarmExists(Context context)
{
    boolean exists = getAlarmPendingIntent(context, true) != null;
    L.d(Updater.class, "AlarmManager exists: " + exists);
    return exists;
}

但是取消警报后,我的检查功能仍然返回true...有人可以指出我的错误吗?

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

    试试这个

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);         
    

    而不是这个

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i,
                flagNoCreate ? PendingIntent.FLAG_NO_CREATE : 0);
    

    【讨论】:

    • 我尝试在取消函数中为 PendingIntent 设置此标志,但之后我的检查函数仍返回 true...
    • 帮助...为了检查和取消,我需要创建带有标志FLAG_NO_CREATEPendingIntent。就我而言,我总是在我的取消函数中创建一个PendingIntent,因此,之后我的检查函数返回 true
    【解决方案2】:

    我只想说我最近正在努力解决这个问题,发现我需要取消 PendingIntent 以及警报:

    pi.cancel();
    alarmManager.cancel(pi);
    

    我不确定 felix 给出的建议是否否定了这一点,但每当我创建 PendingIntent(目的是取消警报)时,我总是以与使用 FLAG_UPDATE_CURRENT 创建警报时完全相同的方式进行操作。例如:

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多