簡體   English   中英

AlarmManager並非每個間隔都精確地調用BroadcastReceiver

[英]AlarmManager not calling BroadcastReceiver precisely every interval

我有以下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分鍾運行一次接收器,但是我應該期望偏差時間有一個相對的百分比嗎?

如何確保將其准確地(或以很小的偏差)調用到指定的間隔?

setRepeating()的文檔中:

注意:從API 19開始,所有重復警報都是不精確的。 如果您的應用程序需要精確的交付時間,則它必須使用一次性精確警報,並如上所述每次重新安排。 targetSdkVersion早於API 19的舊版應用程序將繼續將其所有警報(包括重復警報)視為精確警報。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM