【问题标题】:Pending intent with ONE_SHOT flag带有 ONE_SHOT 标志的待处理意图
【发布时间】:2015-04-21 16:40:34
【问题描述】:

目前我有这个代码:

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);
    }

我想要的是一次使用未决意图并等待火灾。如果同时有人要求一个新的警报,如果警报存在,我不想设置任何东西。现在我的问题是:在第一次警报之后,由于 ONE_SHOT 标志而删除了待处理的意图,但是我可以再次创建待处理的意图吗?

【问题讨论】:

  • If in the meantime someone asks for a new alarm, if the alarm exist I don't want to setup anything 是什么意思?

标签: android alarmmanager android-pendingintent


【解决方案1】:

是的,您当然可以再次创建它。您将获得与第一个不同的PendingIntent

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

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

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

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

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

第二个问题是FLAG_ONE_SHOT 的工作方式。如果您使用FLAG_ONE_SHOT 创建PendingIntent,然后尝试使用FLAG_NO_CREATE 获得PendingIntent,它将始终返回null,即使PendingIntent 尚未使用!由于这种行为,您无法使用FLAG_NO_CREATE 来确定警报是否处于待处理状态,如果您使用FLAG_ONE_SHOT 创建的PendingIntent 设置了警报。

如果你真的想使用这个架构,那么你不能使用FLAG_ONE_SHOT。只需正常创建PendingIntent(不带标志)并使用FLAG_NO_CREATE 检查它的存在。

【讨论】:

  • "要检索使用 FLAG_ONE_SHOT 创建的现有 PendingIntent,需要同时提供 FLAG_ONE_SHOT 和 FLAG_NO_CREATE。" developer.android.com/reference/android/app/PendingIntent
  • @M-WaJeEh 非常有趣。我想知道这是否是新添加到文档中的内容,因为我不记得看到过。当然回答了一些以前的困惑。感谢您提供的信息!
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多