带有 ONE_SHOT 标志的待定意向

Pending intent with ONE_SHOT flag

目前我有这个代码:

public static void setupAlarm(Context context) {
        Intent myIntent = new Intent(context, Receiver.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                0, myIntent, PendingIntent.FLAG_NO_CREATE);
        if (pendingIntent != null) {
            return;
        } else {
            pendingIntent = PendingIntent.getBroadcast(context, PENDING_INTENT_RETRY, myIntent,
                    PendingIntent.FLAG_ONE_SHOT);
        }

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.MINUTE, 2);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    }

我想要的是一次使用pending intent并等待开火。如果在此期间有人要求新警报,如果警报存在我不想设置任何东西。现在我的问题是:在第一个警报之后,由于 ONE_SHOT 标志,挂起的意图被删除,但是我是否可以再次创建挂起的意图?

是的,您当然可以重新创建它。您将得到与第一个不同的 PendingIntent

但是,您发布的代码存在一些问题。首先,您像这样创建 PendingIntent

    pendingIntent = PendingIntent.getBroadcast(context,
            PENDING_INTENT_RETRY, myIntent, PendingIntent.FLAG_ONE_SHOT);

但是你检查它是否存在这样的:

    pendingIntent = PendingIntent.getBroadcast(context,
            0, myIntent, PendingIntent.FLAG_NO_CREATE);

此检查将始终return无效,因为您使用的是不同的requestCode!当您创建 PendingIntent 时,您将 PENDING_INTENT_RETRY 作为 requestCode 传递,但是当您检查它是否存在时,您将 0 作为 requestCode.

传递

第二个问题是 FLAG_ONE_SHOT 的工作方式。如果您使用 FLAG_ONE_SHOT 创建一个 PendingIntent,然后尝试使用 FLAG_NO_CREATE 获取一个 PendingIntent,它将 始终 return null,即使PendingIntent 尚未使用! 由于此行为,如果您使用 [=12= 设置了警报,则无法使用 FLAG_NO_CREATE 确定警报是否未决] 使用 FLAG_ONE_SHOT.

创建

如果你真的要用这个架构,那你就不能用FLAG_ONE_SHOT。只需正常创建 PendingIntent(不带标志)并使用 FLAG_NO_CREATE.

检查其存在