Android AlarmManager-删除/检查不工作的报警

Android AlarmManager-删除/检查不工作的报警,android,alarmmanager,Android,Alarmmanager,我想做以下几点: public static void startUpdater(Context context) { // START TEST CODE cancelAllAlarms(context); alarmExists(context); // END TEST CODE if (true)// !alarmExists(context)) { AlarmManager mgr = (AlarmManager) c

我想做以下几点:

 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;
}
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。。。有人能指出我的错误吗?

试试这个

PendingIntent pi = PendingIntent.getBroadcast(context, 0, i,
            PendingIntent.FLAG_CANCEL_CURRENT);         
而不是这个

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

我想说的是,我最近一直在努力解决这个问题,发现我需要取消挂起的帐篷和闹钟:

pi.cancel();
alarmManager.cancel(pi);
我不确定felix给出的建议是否否定了这一点,但每当我为了取消警报而创建一个挂起的帐篷时,我总是像创建带有当前标志的警报时那样做。例如:

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

希望能有所帮助。

我尝试在cancel函数中为PendingEvent设置此标志,但之后我的check函数返回true…这很有帮助。。。为了检查和取消,我需要创建带有标志_NO _create的PendingEvent。在我的例子中,我总是在cancel函数中创建一个pendingent,因此,之后我的check函数返回true