2016-02-19 23 views
0

我有以下BroadcastReceiverAlarmManager不調用的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分鐘運行一次接收器,但是我應該預計偏差時間的比較百分比嗎?

我怎樣才能確保它會被準確調用(或偏差非常小)到我指定的時間間隔?

+1

自API 19起,警報管理器被稱爲不精確。代替setRepeating,您可以使用setExact並以編程方式自己執行重複。 – Opiatefuchs

+0

@Opiatefuchs「警報管理器被稱爲不精確」,很難相信這會導致將近5分鐘的延遲,不認爲這是(唯一的)問題,還是我錯了? – Strider

+0

如果你確定你的「時間」變量是正確的,那麼還有什麼?是的,5分鐘似乎是一段很長的時間,但正如在API中所描述的那樣,「操作系統將會移動鬧鐘以最大限度地減少喚醒和電池使用」....您是否檢查過您的「時間」設置正確? – Opiatefuchs

回答

1

setRepeating()文檔:

注:爲API 19日,所有重複報警是不準確的。如果您的 應用程序需要精確的交貨時間,那麼它必須使用一次性的精確警報,每次重新計劃如上所述。傳統 targetSdkVersion早於API 19的應用程序 將繼續具有其所有警報,包括重複警報, 視爲確切。

您可以使用setExact()並自行設置間隔。

+0

這是否允許重複調用廣播接收機的? – crm

+0

不,重現必須由您設定。 – Piyush

+0

不能看到批准這個作爲正確答案的理由 –

相關問題