目前我已获得此代码:
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标志而删除了未决意图,但是我可以再次创建待处理意图吗?
答案 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
检查其存在。