Android SDK - 使用相同的Intent设置多个警报不同的额外内容

时间:2016-02-17 22:08:43

标签: android alarmmanager android-pendingintent

我试图让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的意图

我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题是AlarmManager.setRepeative不像官方文档中那样准确。

我是在凌晨2:50开始我的程序所以使用上面的代码,第一次警报应该在50分钟之前启动,因为它需要被触发但由于另一个警报计划在31M,Android OS决定等待3AM警报触发两者(我估计降低电池消耗)。

解决方案是在需要时为警报添加24小时,以确保将来安排它们而不是过去,并使用准确但不重复的AlarmManager.setExact。然后每天重新安排一个新的AlarmManager.setExact

如果您需要比1小时更精确的话,我建议永远不要使用AlarmManager.setRepeative