具有 ONE_SHOT 标志的待定意图

8

目前我有这段代码:

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 标志,待处理意图将被删除,但是我能否重新创建待处理意图呢?


“如果在此期间有人要求新的警报,如果该警报已存在,则我不想设置任何内容”是什么意思? - ADITYA DIXIT
1个回答

13

当然可以再次创建。您将从第一个中获得不同的PendingIntent

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

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

但是你可以像这样检查它是否存在:

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

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

第二个问题是FLAG_ONE_SHOT的工作方式。如果您使用FLAG_ONE_SHOT创建一个PendingIntent,然后尝试使用FLAG_NO_CREATE获取PendingIntent,即使PendingIntent尚未被使用,它也将始终返回null!由于这种行为,如果您使用FLAG_ONE_SHOT创建了设置警报的PendingIntent,则无法使用FLAG_NO_CREATE确定警报是否挂起。

如果您真的想使用这种架构,则不能使用FLAG_ONE_SHOT。只需正常地创建PendingIntent(不要使用标志),然后使用FLAG_NO_CREATE检查其是否存在。


1
要检索使用FLAG_ONE_SHOT创建的现有PendingIntent,需要同时提供FLAG_ONE_SHOT和FLAG_NO_CREATE。 - M-Wajeeh
@M-WaJeEh 非常有趣。我想知道这是否是最近添加到文档中的内容,因为我从来没有见过。当然,这回答了一些以前的困惑。感谢您提供的信息! - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接