簡體   English   中英

Android AlarmManager發送廣播不准時

[英]Android AlarmManager send Broadcast not on time

我使用AlarmManager按時設置兩個操作,

第一個動作設置為10:00:00,第二個動作設置為10:15:00。

我可以播兩個動作

並在10:00:03播出第一個動作(可以),

但請在晚10:29:15,14分鍾播出第二動作!

如何讓AlarmManager可以按時發送廣播?

設置AlarmManager代碼:

@Override
public void onCreate() {
    setSchedule();
}
private void setSchedule(){
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Calendar offCal = Calendar.getInstance();
    offCal.set(Calendar.HOUR_OF_DAY, 10);
    offCal.set(Calendar.MINUTE, 15);
    offCal.set(Calendar.SECOND, 00);
    Intent offIntent = new Intent(this, AlarmReceiver.class);
    offIntent.setAction(AlarmReceiver.ALUM_SCREEN_OFF);
    PendingIntent offPending = PendingIntent.getBroadcast(this, 1,
            offIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC, offCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, offPending);

    Intent onIntent = new Intent(this, AlarmReceiver.class);
    onIntent.setAction(AlarmReceiver.ALUM_SCREEN_ON);
    Calendar onCal = Calendar.getInstance();
    onCal.set(Calendar.HOUR_OF_DAY, 10);
    onCal.set(Calendar.MINUTE, 00);
    onCal.set(Calendar.SECOND, 00);
    PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC_WAKEUP, onCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, onPending);
}

接收方代碼:

public class AlarmReceiver extends BroadcastReceiver {
    public static final String ALUM_SCREEN_ON = "screenOn";
    public static final String ALUM_SCREEN_OFF = "screenOff";
    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d(TAG, "get braodcast action:"+intent.getAction());
}

嗨,您使用的是setRepeating方法,它不會在准確的時間發出警報.Alarm Manager會強烈勸阻除系統應用之外的其他應用准確觸發警報,以實現更好的電池優化。因此,如果您想在特定時間觸發警報,則可以使用setExact()方法這也不會給您完整的保證,但是它將為您提供最准確的保證。雖然一次設置多個警報,請確保在`

PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);

在這里您給了2作為ID,不同的警報應該不同。

由於使用KitKat,set和setRepeating API並不精確。 如果您絕對需要警報在特定時間運行,請使用setExact。 如果警報時間不是很緊急,請考慮使用setWindow代替。

沒有setExactRepeating,因此如果需要,則需要使用setExact,它們可以重新布防警報。 但是,除非您做的是時間緊迫的工作,否則不建議這樣做。

暫無
暫無

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

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