2011-12-12 190 views
45

我正在构建闹钟应用程序。我已经成功实现了基本的闹钟功能。如何使用android闹钟管理器设置多个闹钟

Calendar calendar = Calendar.getInstance(); 
calendar.set(calendar.HOUR_OF_DAY, sHour); 
calendar.set(calendar.MINUTE, sMin); 
calendar.set(calendar.SECOND, 0); 
calendar.set(calendar.MILLISECOND, 0); 
long sdl = calendar.getTimeInMillis(); 

Intent intent = new Intent(AlarmList.this, AlarmReceiver.class); 
PendingIntent sender = PendingIntent.getBroadcast(AlarmList.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager ALARM1 = (AlarmManager)getSystemService(ALARM_SERVICE); 
ALARM1.set(AlarmManager.RTC_WAKEUP, sdl, sender); 

在我的应用程序中,用户可以选择天(星期日,星期一...)每周重复一次警报。 我试图创建多个闹钟来重复每周,但不知道如何去做。 可以使用(重复)间隔创建它,还是应创建多个警报管理器?

+0

只需使用id字段...查看文档上alarmmanager集。 – Warpzit

+0

在这篇文章看到我的答案http://stackoverflow.com/questions/12785702/android-set-multiple-alarms/31805171#31805171 – Junaid

回答

126

您需要使用different Broadcast id's作为pending intents。事情是这样 :

Intent intent = new Intent(load.this, AlarmReceiver.class); 
    final int _id = (int) System.currentTimeMillis(); 
    PendingIntent appIntent = PendingIntent.getBroadcast(this, _id, intent,PendingIntent.FLAG_ONE_SHOT); 

使用系统的时间应该是每个未到 意图你火的唯一标识符。

+1

非常感谢你,这就是我是寻找和找不到什么搜索和如何搜索,最后这解决了我的问题,谢谢很多队友:) –

+2

我们最终如何取消所有这些?我们需要保留_id的引用? –

+1

@ user2427819是的,对于取消,我们必须通过相同的身份证,我们用于PendingIntent.getBroadcast –

10

the docs

如果已经有这个意向计划(有两个意图的 平等的filterEquals(Intent)被定义报警,然后 它会通过这一个

拆除和更换

多个AlarmManagers不能解决您的问题,如果他们有多个不同的警报(不同的时间和不同的日子),那么你需要在每次你设置BroadcastReceiver消除先前的警报。

您还需要保持RECEIVE_BOOT_COMPLETED并有一个BroadcastReceiver接收引导,以便如果电话重新启动,您可以重新安排您的警报。

+1

谢谢你的帮助。我会尝试 – Hassy31

7

要设置多个警报,您需要每次定义您的Intent以便与其他区别。我觉得这样做最简单的方法是设置你的Intent东西data领域如下:

// give your alarm an id and save it somewhere 
// in case you want to cancel it in future 
String myAlarmId = ...; 

// create your Intent 
Intent intent = new Intent(AlarmList.this, AlarmReceiver.class); 
intent.setData(Uri.parse("myalarms://" + myAlarmId)); 
... 

代码@ Hassy31的其余部分是罚款,是和保持不变。

请注意,根据文档,PendingIntent.getBroadcast()方法中的requestCode参数(根据@parag建议)未使用,因此这不是正确的解决方法。

+1

嗨,它说它是未使用的? – blacharnia

+0

在撰写本文时可能这是真实的,并且可能不再真实。 –

2

设定的广播id为的PendingIntent

for (int id = 0; id < 3; id++) { 
     // Define pendingintent 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id,ntent, 0); 
     // set() schedules an alarm 
     alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent); 
}