Android AlarmManager 未按时发送广播

Android AlarmManager send Broadcast not on time

我使用 AlarmManager 按时设置两个动作,

第一个操作设置为 10:00:00,第二个操作设置为 10:15:00。

我可以得到两个动作广播,

并在 10:00:03 上获得第一个动作广播(可以),

但在 10:29:15 收到第二个动作广播,晚了 14 分钟!

如何让AlarmManager准时发送广播??

设置AlarmManager代码:

@Override
public void onCreate() {
    setSchedule();
}
private void setSchedule(){
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Calendar offCal = Calendar.getInstance();
    offCal.set(Calendar.HOUR_OF_DAY, 10);
    offCal.set(Calendar.MINUTE, 15);
    offCal.set(Calendar.SECOND, 00);
    Intent offIntent = new Intent(this, AlarmReceiver.class);
    offIntent.setAction(AlarmReceiver.ALUM_SCREEN_OFF);
    PendingIntent offPending = PendingIntent.getBroadcast(this, 1,
            offIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC, offCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, offPending);

    Intent onIntent = new Intent(this, AlarmReceiver.class);
    onIntent.setAction(AlarmReceiver.ALUM_SCREEN_ON);
    Calendar onCal = Calendar.getInstance();
    onCal.set(Calendar.HOUR_OF_DAY, 10);
    onCal.set(Calendar.MINUTE, 00);
    onCal.set(Calendar.SECOND, 00);
    PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC_WAKEUP, onCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, onPending);
}

收件人代码:

public class AlarmReceiver extends BroadcastReceiver {
    public static final String ALUM_SCREEN_ON = "screenOn";
    public static final String ALUM_SCREEN_OFF = "screenOff";
    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d(TAG, "get braodcast action:"+intent.getAction());
}

自 KitKat 起,set 和 setRepeating API 就不准确了。如果您绝对需要在特定时间将闹钟设为 运行,请使用 setExact。如果闹钟时间不重要,请考虑改用 setWindow。

没有 setExactRepeating,因此如果您需要,您需要使用 setExact,它们会重新设置您的闹钟。但是除非你在做时间紧迫的事情,否则不推荐这样做。

您好,您使用的是 setRepeating 方法,该方法不会在准确时发出警报 time.Alarm 如果您想触发,管理员会强烈反对系统应用程序以外的其他应用程序准确触发警报以获得更好的电池 optimization.so在特定时间发出警报意味着您可以使用 setExact() 方法这也不会为您提供完整的保证,但它会给您最准确的保证。同时设置多个警报时,请确保您在`[=11 中提供不同的 ID =]

PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);

这里你给了2作为id,不同的闹钟应该是不同的。