带有 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
.
检查其存在
目前我有这个代码:
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
.