如何在安卓系统中同时设置多个闹钟?

15

我正在制作一个小应用程序,需要从数组中设置闹钟,但只有最后一个闹钟能够正常工作,为什么会这样?以下是我的代码:

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);

                    } 

提前致谢


你可以使用这个多重闹钟 - Uttam
@Uttam Utils.getTimeAfterInSecs(45);无法工作,因为没有内部类Utils,那么我该如何实现相同的功能? - Nitin
你好,能否请您发布带有接收器的完整代码,以便同时设置多个闹钟。 - Jayman Jani
1个回答

27

在您的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,你为数组中的每个项目提供了一个新的唯一标识符。请记住,如果你想取消警报,你需要使用另一个for循环并逐个取消它们。我个人会将所有的警报添加到它们自己的数组中,以便我可以单独处理它们。
然后,如果你需要取消它们:
    private void cancelAlarms(){
    if(intentArray.size()>0){
        for(int i=0; i<intentArray.size(); i++){
            alarmmanager.cancel(intentArray.get(i));
        }
        intentArray.clear();
    }
}

我更新了我的答案并添加了一些代码。请记住,这不符合文档。不久前我在一个项目中遇到了这个问题。 - ryandlf
7
为什么需要一组AlarmManager数组? - KarolDepka
1
在重新启动应用程序时,数组值被重置。无法删除警报。使用静态值,值也被重置。无法通过唯一标识生成的方式取消警报。您能否帮我取消所有的闹钟? - Karthick
1
嘿,伙计.. 你救了我的命.. 谢谢 :) - meen
我不明白数组arr2是什么!有人可以帮忙吗? - vss
如果设置了闹钟1,然后关闭了应用程序,在闹钟响起之前重新打开应用程序并设置另一个闹钟,那么会发生什么?由于循环的数组索引对于两个闹钟都是0,因此请求代码将相同,这样不会覆盖先前的闹钟吗? - User9211

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接