我正在创建一个小应用程序,我必须从数组设置警报但只设置一个警报,并且在阵列的最后位置的时间工作,为什么它的行为如下所示是我的代码
AlarmManager[] alarmManager=new AlarmManager[24];
for(f=0;f<arr2.length;f++)
{
Intent intent = new Intent(AlarmR.this, Riciving.class);
pi=PendingIntent.getBroadcast(AlarmR.this, 0,intent, 0);
alarmManager[f] = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager[f].set(AlarmManager.RTC_WAKEUP,arr2[f] ,pi);
}
先谢谢
答案 0 :(得分:22)
在pendingIntent
上,您需要将第二个requestCode
设置为唯一的号码。我通常通过for循环运行数组,并为数组中的每个项动态设置请求代码。没有requestCode
警报会相互覆盖。
AlarmManager[] alarmManager=new AlarmManager[24];
intentArray = new ArrayList<PendingIntent>();
for(f=0;f<arr2.length;f++){
Intent intent = new Intent(AlarmR.this, Riciving.class);
pi=PendingIntent.getBroadcast(AlarmR.this, f,intent, 0);
alarmManager[f] = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager[f].set(AlarmManager.RTC_WAKEUP,arr2[f] ,pi);
intentArray.add(pi);
}
基本上,您只想将requestCode
更改为动态数字。通过将其设置为f
,您可以为阵列中的每个项目提供一个新的唯一ID。请记住,如果要取消警报,则需要使用另一个for循环并单独取消每个警报。我个人将所有警报添加到他们自己的阵列中,以便我可以单独处理它们。
然后,如果您需要取消它们:
private void cancelAlarms(){
if(intentArray.size()>0){
for(int i=0; i<intentArray.size(); i++){
alarmmanager.cancel(intentArray.get(i));
}
intentArray.clear();
}
}
答案 1 :(得分:3)
如果要设置多个警报(重复或单个),则只需要使用不同的requestCode创建其PendingIntents。如果requestCode相同,则新警报将覆盖旧警报。
以下是创建多个单个警报并将它们保存在ArrayList中的代码。我将PendingIntent保留在数组中,因为您需要取消警报。
//上下文变量包含您的Context
AlarmManager mgrAlarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
for(i = 0; i < 10; ++i)
{
Intent intent = new Intent(context, OnAlarmReceiver.class);
// Loop counter `i` is used as a `requestCode`
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
// Single alarms in 1, 2, ..., 10 minutes (in `i` minutes)
mgrAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000 * i,
pendingIntent);
intentArray.add(pendingIntent);
}