2013-02-19 88 views
1

我的应用程序在特定时间安排了多个报警。这些警报是在应用程序启动时计划的。 (每天有5个警报,每周有35个警报)...计划报警未正常触发

我已通过日志验证这些警报是在应用程序启动时安排的。

问题是当我开始测试我的应用程序时,7个警报完全正常。然而,第8次报警并未解除。我已经通过让我的设备保持1天以上来测试这种情况。我该如何调试这种行为,以及可能的原因是什么可以防止触发警报。

编辑:

代码调度:

try { 
    if (info != null) { 
     Calendar c = Calendar.getInstance(); 
     c.set(Calendar.YEAR, year); 
     c.set(Calendar.MONTH, month); 
     c.set(Calendar.DAY_OF_MONTH, day); 
     c.set(Calendar.HOUR_OF_DAY, info.getHour()); 
     c.set(Calendar.MINUTE, info.getMinute()); 
     c.set(Calendar.SECOND, 0); 

     Intent intent = new Intent(context, AlarmReceiverActivity.class); 
     intent.putExtra("name", info.getPrayerName()); 
     intent.putExtra("sound", soundType); 

     intent.putExtra("time", formatTimeClock(context, info.getHour(), info.getMinute())); 

     PendingIntent pendingIntent = PendingIntent.getActivity(context, alarmId, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent); 
    } 
} catch (Exception e) { 
    Log.e("ALarmSchedularManager", e.getMessage()); 
} 
+1

您能否显示您的AlarmManager setRepeating代码部分 – Sree 2013-02-19 10:12:29

+0

调度警报的共享代码。 – muneikh 2013-02-19 10:24:59

回答

2

如何调试这种行为

使用adb shell dumpsys alarm看你定闹钟是什么,当他们下一个要被调用。

是什么阻止报警烧制

您的代码不会出现考虑到时间已经过去的可能性,尽管这可能会在代码之外处理的可能原因片断告诉你以上。

+0

谢谢,你能帮助我如何理解系统dumpsys: RTC_WAKEUP#723:报警{41d63e98类型0 com。示例} 类型= 0时= + 3d11h33m50s418ms按repeatInterval = 0计数= 0 操作= {的PendingIntent 41882d80:PendingIntentRecord {41d63df8 com.athan startActivity}} 如果我错了,请纠正我: #723:报警ID when:以毫秒为基准的时间。 repeatInterval:这不是一个重复的闹钟 – muneikh 2013-02-19 13:18:20

+1

@Maverick:“when”表示你的闹钟将会在你跑步三天,十一小时,三十三分钟,五十秒和四百一十八毫秒'dumpsys'命令。 – CommonsWare 2013-02-19 13:21:08

+0

非常感谢。我知道了。 – muneikh 2013-02-19 13:23:22

1

希望下面的代码将有所帮助,我用同样的在我的应用程序。这里重复在AlarmManager类传入的参数应该是24 * 60 * 60 * 1000

AlarmManager am = (AlarmManager) ct.getSystemService(Context.ALARM_SERVICE);   
Intent intent1 = new Intent(ct, TimeAlarm.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(ct, 0,intent1, PendingIntent.FLAG_CANCEL_CURRENT); 

Date curr=new Date(); 
curr.setHours(h); 
curr.setMinutes(m); 
c.setTime(curr); 
c.set(Calendar.SECOND, 0); 

Calendar c1 = Calendar.getInstance(); 
am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),24*60*60*1000, pendingIntent); 

,而不是硬编码操作(24 * 60 * 60 * 1000),你可以使用AlarmManager.INTERVAL_DAY。勾选此不同的间隔高达1天http://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_DAY

+0

谢谢,但我不能在这里使用setRepeating,因为用户可以随时更新单个警报。 – muneikh 2013-02-19 10:51:11

+0

你可以。只需存储用于设置警报的Intent,并在用户更改警报时使用'am.cancel(mPendingIntent)'。然后设置新的。 – 2013-02-19 11:46:54

+0

这应该是你这样做的方式,使用setRepeating与不精确的间隔。否则你的应用会耗尽很多电池。 – 2013-02-19 11:49:08