AlarmManager不能按预期运行

问题描述:

正如你建议我使用AlarmManager而不是Timer,我想程序会运行。
但不幸的是,它没有。或者,更好的,并不总是...AlarmManager不能按预期运行

这是我的代码:

long millis = 0; 

this.alarmMgr = (AlarmManager)this.main.getSystemService(Context.ALARM_SERVICE); 

this.checkPendingIntent = PendingIntent.getBroadcast(this.main, 0, 
       new Intent(this.main, AlarmReceiver.class), 0); 

if(frequency.compareTo("1HOUR") == 0) 
    millis = 3600 * 1000; 
if(frequency.compareTo("12HOUR") == 0) 
    millis = 12 * 3600 * 1000; 
if(frequency.compareTo("1DAY") == 0) 
    millis = 24 * 3600 * 1000; 
if(frequency.compareTo("1WEEK") == 0) 
    millis = 7 * 24 * 3600 * 1000; 

this.alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, 
     System.currentTimeMillis(), millis, this.checkPendingIntent); 

我期待的是,悬而未决的意图(AlarmReceiver)都会被调用x毫秒,但事实并非如此。
我可以在手机的日志中看到它不会被调用,并且在我的服务器日志中(接收方发送HTTP请求),没有收到请求。很奇怪的是,有时它运行,但我不能再现这种情况。

有人可以说我做错了什么吗?

非常感谢
卢卡Bertoncello

这是怎样,如果你想每天重复闹钟使用报警

Calendar now = Calendar.getInstance(); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, yourHour); 
calendar.set(Calendar.MINUTE, yourMin); 
calendar.set(Calendar.SECOND, youSec); 

if (calendar.before(now)) { //if time passed 
    calendar.add(Calendar.DATE,1); 
} 
Intent intent = new Intent(Context.this, DestinationActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity 
       (Settings.this,123456, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
             AlarmManager.INTERVAL_DAY,pendingIntent); 

使用setRepeating一个简单的例子。
如果我想知道我使用setAlarm(.. .. .. ..),而不是

+0

谢谢,我会尝试。你能解释一下为什么你使用setTimeInMillis作为日历,然后再使用calendar.set? – 2013-04-27 07:13:30

+0

好吧,它似乎工作...我会测试你的例子今天和明天,期待每小时一个请求。非常感谢 – 2013-04-27 10:32:08

+0

@LucaBertoncello您可以设置闹钟,然后更改设置的时间。当警报到来时,警报将被解除。如果您发现我的回答有用,请将它投票并接受为答案 – 2013-04-28 04:39:05

退房这个 -

Intent intentalarm = new Intent("com.mubble.powercutsensorapp.MYTIMER"); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentalarm, 0); 
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    long now = System.currentTimeMillis(); 
    long interval = 24*60 * 60 * 1000; // 24 hour 
    manager.setRepeating(AlarmManager.RTC_WAKEUP, now + interval, interval, 
     pendingIntent);