目前我有这个代码:
public static void setupAlarm(Context context) { Intent myIntent = new Intent(context,Receiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,myIntent,PendingIntent.FLAG_NO_CREATE); if (pendingIntent != null) { return; } else { pendingIntent = PendingIntent.getBroadcast(context,PENDING_INTENT_RETRY,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标志而导致挂起的意图被删除,但是我可以再次创建待处理的意图吗?
解决方法
是的,当然你可以再创建它.您将从第一个获得不同的PendingIntent.
但是,您发布的代码存在一些问题.首先,您创建PendingIntent,如下所示:
pendingIntent = PendingIntent.getBroadcast(context,PendingIntent.FLAG_ONE_SHOT);
但你检查它是否像这样存在:
pendingIntent = PendingIntent.getBroadcast(context,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_ONE_SHOT创建的PendingIntent设置了该警报,则无法使用FLAG_NO_CREATE来确定警报是否处于挂起状态.
如果您确实想使用此架构,则无法使用FLAG_ONE_SHOT.只需正常创建PendingIntent(不带标志)并使用FLAG_NO_CREATE检查其存在.