我有以下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方法從活性試驗: LocationUpdateReceiver.SetAlarm(此,3000L);
你會注意到我打電話setRepeating()
,我認爲它應該每隔3秒調用一次接收器類?
麻煩的是,更多的時候,它不會超過5分鐘不打電話給接收器,這是一個相當大的偏差。我打算每隔30分鐘運行一次接收器,但是我應該預計偏差時間的比較百分比嗎?
我怎樣才能確保它會被準確調用(或偏差非常小)到我指定的時間間隔?
自API 19起,警報管理器被稱爲不精確。代替setRepeating,您可以使用setExact並以編程方式自己執行重複。 – Opiatefuchs
@Opiatefuchs「警報管理器被稱爲不精確」,很難相信這會導致將近5分鐘的延遲,不認爲這是(唯一的)問題,還是我錯了? – Strider
如果你確定你的「時間」變量是正確的,那麼還有什麼?是的,5分鐘似乎是一段很長的時間,但正如在API中所描述的那樣,「操作系統將會移動鬧鐘以最大限度地減少喚醒和電池使用」....您是否檢查過您的「時間」設置正確? – Opiatefuchs