AlarmManager 没有在每个时间间隔精确地调用 BroadcastReceiver

AlarmManager not calling BroadcastReceiver precisely every interval

我有以下 BroadcastReceiver:

public class LocationUpdateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        LocationHelper locationHelper = new LocationHelper(context);
        locationHelper.updateLocation();

        //.. do stuff with location

    }

    public static void SetAlarm(Context context, Long time){
        Intent intentAlarm = new Intent(context, LocationUpdateReceiver.class);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), time, pi);
    }

    public static void CancelAlarm(Context context) {
        Intent intent = new Intent(context, LocationUpdateReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}

我这样调用 setAlarm 方法来从 Activity 进行测试: LocationUpdateReceiver.SetAlarm(这个, 3000L);

您会注意到我调用了 setRepeating(),我认为它应该每 3 秒调用接收器 class?

麻烦的是,更多的时候它不会超过 5 分钟不呼叫接收器,这是一个相当大的偏差。我打算每 30 分钟 运行 接收器,但我应该期望偏差时间的比较百分比吗?

我怎样才能确保它会准确地(或以非常小的偏差)被调用到我指定的时间间隔?

来自 setRepeating() 的文档:

Note: as of API 19, all repeating alarms are inexact. If your application needs precise delivery times then it must use one-time exact alarms, rescheduling each time as described above. Legacy applications whose targetSdkVersion is earlier than API 19 will continue to have all of their alarms, including repeating alarms, treated as exact.

您可以使用 setExact() 并自行设置间隔。