代码之家  ›  专栏  ›  技术社区  ›  crmepham

AlarmManager没有每隔一段时间精确调用BroadcastReceiver

  •  0
  • crmepham  · 技术社区  · 10 年前

    我有以下内容 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方法来测试活动: LocationUpdateReceiver(位置更新接收器)。设置警报(此,3000L);

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

    问题是,通常情况下,它在超过5分钟的时间内没有呼叫接收器,这是一个很大的偏差。我打算每30分钟运行一次接收器,但我是否应该期望偏差时间的相对百分比?

    我如何才能确保它会被精确地(或以非常小的偏差)调用到我指定的间隔?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Piyush Razack    10 年前

    来自的文档 setRepeating() :

    注:从API 19开始,所有重复报警都是不准确的。如果您 应用程序需要精确的交付时间,然后必须一次性使用 精确的警报,如上所述重新安排每次。遗产 targetSdkVersion早于API 19的应用程序将 继续进行所有报警,包括重复报警, 被视为精确的。

    您可以使用 setExact() 并自己设定时间间隔。

    推荐文章