我试图让2个重复的警报触发相同的Intent,但是有不同的额外内容:
// first alarm @ 2AM
Calendar calendar1 = Calendar.getInstance();
calendar1.set(Calendar.HOUR_OF_DAY, 2);
calendar1.set(Calendar.MINUTE, 0);
calendar1.set(Calendar.SECOND, 0);
// second alarm @ 3AM
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.HOUR_OF_DAY, 3);
calendar2.set(Calendar.MINUTE, 0);
calendar2.set(Calendar.SECOND, 0);
// Set both intents with differing extras
Intent intent1 = new Intent(context, Receiver.class);
intent1.putExtra("status", true);
Intent intent2 = new Intent(context, Receiver.class);
intent2.putExtra("status", false);
// Set both pending Intents with differint ids
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 2, intent2, 0);
AlarmManager alarm1 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm1.setRepeating(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent1);
AlarmManager alarm2 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm2.setRepeating(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent2);
以下是Intent触发的内容
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("MyApp", "Received intent with status : " + intent.getBooleanExtra("status", false));
}
.....
}
但由于一个奇怪的原因,这两个意图都是在凌晨3点左右触发的:
收到状态为false的意图
收到状态为true的意图
我做错了什么?
答案 0 :(得分:0)
问题是AlarmManager.setRepeative
不像官方文档中那样准确。
我是在凌晨2:50开始我的程序所以使用上面的代码,第一次警报应该在50分钟之前启动,因为它需要被触发但由于另一个警报计划在31M,Android OS决定等待3AM警报触发两者(我估计降低电池消耗)。
解决方案是在需要时为警报添加24小时,以确保将来安排它们而不是过去,并使用准确但不重复的AlarmManager.setExact
。然后每天重新安排一个新的AlarmManager.setExact
。
如果您需要比1小时更精确的话,我建议永远不要使用AlarmManager.setRepeative
。