等待ONE_SHOT标志的意图

时间:2015-04-21 16:40:35

标签: android alarmmanager android-pendingintent

目前我已获得此代码:

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标志而删除了未决意图,但是我可以再次创建待处理意图吗?

1 个答案:

答案 0 :(得分:12)

是的,当然你可以再创一次。您将从第一个获得不同的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的工作方式。如果您使用PendingIntent创建FLAG_ONE_SHOT,然后尝试使用PendingIntent获取FLAG_NO_CREATE,则将始终返回null,即使PendingIntent尚未使用!由于此行为,如果您使用FLAG_NO_CREATE创建的PendingIntent设置了此警报,则无法使用FLAG_ONE_SHOT来确定警报是否处于待处理状态}。

如果您确实想使用此架构,则无法使用FLAG_ONE_SHOT。只需正常创建PendingIntent(无标记)并使用FLAG_NO_CREATE检查其存在。