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

时间:2016-02-19 12:09:24

标签: java android broadcastreceiver alarmmanager

我有以下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(this,3000L);

你会注意到我打电话给setRepeating()我认为应该每隔3秒调用一次接收器类吗?

麻烦的是,更常见的是它不会在5分钟内调用接收器,这是一个很大的偏差。我打算每隔30分钟运行一次接收器,但是我应该预计偏差时间的比例是多少吗?

我怎样才能确保它会被指定的间隔完全(或偏差很小)?

1 个答案:

答案 0 :(得分:1)

来自setRepeating()的文档:

  

注意:从API 19开始,所有重复警报都不准确。如果你的   应用程序需要精确的交付时间,然后必须使用一次性   确切的警报,每次重新安排,如上所述。遗产   targetSdkVersion早于API 19的应用程序将   继续发出所有警报,包括重复警报,   确切地对待。

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