我有以下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分钟运行一次接收器,但是我应该预计偏差时间的比例是多少吗?
我怎样才能确保它会被指定的间隔完全(或偏差很小)?
答案 0 :(得分:1)
来自setRepeating()的文档:
注意:从API 19开始,所有重复警报都不准确。如果你的 应用程序需要精确的交付时间,然后必须使用一次性 确切的警报,每次重新安排,如上所述。遗产 targetSdkVersion早于API 19的应用程序将 继续发出所有警报,包括重复警报, 确切地对待。
您可以使用setExact()并自行设置间隔。