2013-07-12 103 views
0

我正在创建具有闹钟功能的闹钟应用程序。时间显示正常,我也正确设置了多个闹钟。Android中的闹钟设置关闭和打开

我使用不同的ID创建多个警报,并将其保存到数据库中,以便我可以在列表视图中查看警报列表。现在我正在尝试为我的闹钟设置开启和关闭功能。那里有问题。

在itemClick在如果报警后它将切断的帮助下:

Intent intent = new Intent(Main.this,TaskRecieverForAlarm.class); 
    PendingIntent pi = PendingIntent.getBroadcast(Main.this, Integer.parseInt(cont[0]), intent, 0); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
    am.cancel(pi); 

上面的代码取消报警完美的罚款。

要打开我使用的报警:一旦

Intent intent = new Intent(Main.this, TaskRecieverForAlarm.class); 
intent.putExtra("AlarmDate", cont[1]); 
intent.putExtra("key", Integer.parseInt(cont[0])); 
PendingIntent sender = PendingIntent.getBroadcast(Main.this, Integer.parseInt(cont[0]) , intent, PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

if(type.equalsIgnoreCase("daily")) 
{ 
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender); 
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1440*60000 ,sender); 
} 
else if(type.equalsIgnoreCase("weekly")) 
{ 
    am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);     am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 7*1440*60000 ,sender); 
} 

现在,当我点击OFF到ON,报警触发和调用TASKReceiverFORAlarm(广播接收器),即使报警时间为4或5距离当前时间的小时。我不确定我哪里出错了?

有人可以帮我吗?

谢谢!

+0

我认为你需要使用'FLAG_CANCEL_CURRENT',而不是'FLAG_UPDATE_CURRENT',但这只是一个猜测。请尝试一下,并在这里回顾结果。 – g00dy

+0

改变了它,但仍然一样。 PendingIntent sender = PendingIntent.getBroadcast(Main.this,Integer.parseInt(cont [0]),intent,PendingIntent.FLAG_UPDATE_CURRENT); TO PendingIntent sender = PendingIntent.getBroadcast(Main.this,Integer.parseInt(cont [0]),intent,PendingIntent.FLAG_CANCEL_CURRENT); – Mary

+0

好的,这不起作用,请尝试下面的解决方案。 – g00dy

回答

0

我想我找到了答案here

public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) 

Added in API level 1 
Schedule a repeating alarm. Note: for timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler. If there is already an alarm scheduled for the same IntentSender, it will first be canceled. 

Like set(int, long, PendingIntent), except you can also supply a rate at which the alarm will repeat. This alarm continues repeating until explicitly removed with cancel(PendingIntent). If the time occurs in the past, the alarm will be triggered immediately, with an alarm count depending on how far in the past the trigger time is relative to the repeat interval. 

If an alarm is delayed (by system sleep, for example, for non _WAKEUP alarm types), a skipped repeat will be delivered as soon as possible. After that, future alarms will be delivered according to the original schedule; they do not drift over time. For example, if you have set a recurring alarm for the top of every hour but the phone was asleep from 7:45 until 8:45, an alarm will be sent as soon as the phone awakens, then the next alarm will be sent at 9:00. 

If your application wants to allow the delivery times to drift in order to guarantee that at least a certain time interval always elapses between alarms, then the approach to take is to use one-time alarms, scheduling the next one yourself when handling each alarm delivery. 

Parameters 
type One of ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP}, RTC or RTC_WAKEUP. 
triggerAtMillis time in milliseconds that the alarm should first go off, using the appropriate clock (depending on the alarm type). 
intervalMillis interval in milliseconds between subsequent repeats of the alarm. 
operation Action to perform when the alarm goes off; typically comes from IntentSender.getBroadcast(). 

您使用该功能的方法是:

am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1440*60000 ,sender); 

试试这个:

//The only variable here is the desired hour of the alarm, which 
// has to be obtained in milliseconds 
long alarmSetAt = // The hour of the Alarm for the current date in milliseconds 
long time = cal.getTimeInMillis() - alarmSetAt; 

if(time > 0){ 

    time = -time + cal.getTimeInMillis(); 
} 
else{ 
    time = time + cal.getTimeInMillis() + 1440*60000; 
} 

am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1440*60000 ,sender);