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