Android:使用AlarmManager设置所有PendingIntents

blu*_*nte 68 android alarmmanager

我正在设置这样的警报:

alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent);
Run Code Online (Sandbox Code Playgroud)

我有兴趣删除之前设置的所有警报,清除它们.

有没有办法让我这样做或获取当前设置的所有警报,以便我可以手动删除它们?

gil*_*s88 81

您不必继续参考它.只需定义一个新的PendingIntent,就像你在创建它时定义的那样.

例如:

如果我创建了一个由AlarmManager触发的PendingIntent,如下所示:

   Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
    alarmIntent.setData(Uri.parse("custom://" + alarm.ID));
    alarmIntent.setAction(String.valueOf(alarm.ID));
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);

    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDateTime, displayIntent);
Run Code Online (Sandbox Code Playgroud)

然后在其他代码(甚至是其他活动)的某处,您可以取消:

Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
alarmIntent.setData(Uri.parse("custom://" + alarm.ID));
alarmIntent.setAction(String.valueOf(alarm.ID));
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);

alarmManager.cancel(displayIntent);
Run Code Online (Sandbox Code Playgroud)

这里重要的是将PendingIntent设置为完全相同的数据和操作,以及其他标准以及此处所述http://developer.android.com/reference/android/app/AlarmManager.html#cancel%28android.app .PendingIntent 29%

  • 为alarmIntent.setData +1(Uri.parse("custom://"+ alarm.ID)); alarmIntent.setAction(将String.valueOf(alarm.ID)); (5认同)
  • @mas_bejo setData(...)上的alarm.ID用于报警的唯一性,以便我们可以在使用setAction(...)时清除任何先前设置的具有相同alarm.ID的报警,以便从通知传递意图通过onNewIntent()返回到Activity时是正确的值.我在设置闹钟时使用setData和setAction,当我从通知中接收到来自通知时,我通过覆盖onNewIntent of Activity来获得意图.我得到的意图是正确的,因为之前的setAction(...).我希望这有帮助. (2认同)

Ale*_*voy 64

您需要创建待处理的意图,然后取消它

 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class);
    PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);

    // Cancel alarms
    try {
        alarmManager.cancel(pendingUpdateIntent);
    } catch (Exception e) {
        Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
    }
Run Code Online (Sandbox Code Playgroud)

  • 无需参考.alarmManager.cancel取消所有文档:删除具有匹配Intent的所有警报.任何类型的警报,其Intent与此匹配的警报(由filterEquals(Intent)定义)将被取消. (43认同)
  • 匹配`Intent`s时不考虑@FinalDark附加功能,因此在创建它时,`Intent`中的附加内容没有区别.您可以使用"Intent"取消警报而无需额外的操作. (10认同)
  • 如果我的意图有一些额外的价值或捆绑...如果我需要创建具有相同额外值的相同意图以便能够取消意图怎么办? (6认同)
  • 如何保留对它们的引用我将所有内容存储在数据库中所以如何保持对它的引用? (5认同)
  • 还需要执行endingUpdateIntent.cancelt()使其完全工作 (2认同)

ext*_*mkv 15

要取消警报,您需要重新创建相同的PendingIntent并传递相同的请求代码.

因此,我创建了一个AlarmUtils来帮助我保存首选项中的所有请求代码,以便将来取消它时如果需要的话.您只需使用以下类并调用以下方法:

  • addAlarm 添加新警报并传递请求代码.
  • cancelAlarm要删除警报,您需要重新创建相同的
    Intent并传递相同的请求代码.
  • hasAlarm 要验证该警报是否已添加,您需要重新创建相同的Intent并传递相同的请求代码.
  • cancelAllAlarms 删除所有设置的警报.

我的AlarmUtils

public class AlarmUtils {

    private static final String sTagAlarms = ":alarms";

    public static void addAlarm(Context context, Intent intent, int notificationId, Calendar calendar) {

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }

        saveAlarmId(context, notificationId);
    }

    public static void cancelAlarm(Context context, Intent intent, int notificationId) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();

        removeAlarmId(context, notificationId);
    }

    public static void cancelAllAlarms(Context context, Intent intent) {
        for (int idAlarm : getAlarmIds(context)) {
            cancelAlarm(context, intent, idAlarm);
        }
    }

    public static boolean hasAlarm(Context context, Intent intent, int notificationId) {
        return PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_NO_CREATE) != null;
    }

    private static void saveAlarmId(Context context, int id) {
        List<Integer> idsAlarms = getAlarmIds(context);

        if (idsAlarms.contains(id)) {
            return;
        }

        idsAlarms.add(id);

        saveIdsInPreferences(context, idsAlarms);
    }

    private static void removeAlarmId(Context context, int id) {
        List<Integer> idsAlarms = getAlarmIds(context);

        for (int i = 0; i < idsAlarms.size(); i++) {
            if (idsAlarms.get(i) == id)
                idsAlarms.remove(i);
        }

        saveIdsInPreferences(context, idsAlarms);
    }

    private static List<Integer> getAlarmIds(Context context) {
        List<Integer> ids = new ArrayList<>();
        try {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
            JSONArray jsonArray2 = new JSONArray(prefs.getString(context.getPackageName() + sTagAlarms, "[]"));

            for (int i = 0; i < jsonArray2.length(); i++) {
                ids.add(jsonArray2.getInt(i));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return ids;
    }

    private static void saveIdsInPreferences(Context context, List<Integer> lstIds) {
        JSONArray jsonArray = new JSONArray();
        for (Integer idAlarm : lstIds) {
            jsonArray.put(idAlarm);
        }

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(context.getPackageName() + sTagAlarms, jsonArray.toString());

        editor.apply();
    }
}
Run Code Online (Sandbox Code Playgroud)