簡體   English   中英

AlarmManager不會按時觸發

[英]AlarmManager does not fire on time

我希望AlarmManager每天上午10:30根據用戶移動設備時間被解雇。 它肯定會在上午10:30發射,但問題是在上午10:30之后,它會在沒有時間的情況下重復,就像在每半小時之后或在任何不尋常的時間間隔之后。

如何防止這個問題? 我在成功登錄和注冊ButtonCick()事件上調用它。 如果用戶注銷,我也想停止此操作。

我的代碼如下:

        Intent myIntent = new Intent(Register.this, AlarmReceiver.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(Register.this,
                0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        Calendar firingCal = Calendar.getInstance();
        Calendar currentCal = Calendar.getInstance();

        firingCal.set(Calendar.HOUR_OF_DAY, 10);
        firingCal.set(Calendar.MINUTE, 30);
        firingCal.set(Calendar.SECOND, 0);

        long intendedTime = firingCal.getTimeInMillis();
        long currentTime = currentCal.getTimeInMillis();

        if (intendedTime >= currentTime) {

            WakeLocker.acquire(getApplicationContext());

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime,
                    AlarmManager.INTERVAL_DAY, pendingIntent);

            WakeLocker.release();

        } else {

            WakeLocker.acquire(getApplicationContext());

            firingCal.add(Calendar.DAY_OF_MONTH, 1);
            intendedTime = firingCal.getTimeInMillis();

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime,
                    AlarmManager.INTERVAL_DAY, pendingIntent);

            WakeLocker.release();
        }

代碼似乎很好。 如果目標版本是19,

注意:

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

資料來源: http //developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int,long,long,android.app.PendingIntent)

注意:

從API 19開始,傳遞給此方法的觸發時間被視為不精確:警報將不會在此時間之前傳遞,但可能會延遲並在稍后傳遞。 操作系統將使用此策略在整個系統中將警報“批處理”在一起,從而最大限度地減少設備需要“喚醒”並最大限度地減少電池使用的次數。 一般而言,只要在將來安排的警報,就不會延遲在不久的將來安排的警報。

采用新的配料政策,交貨訂單保證不像以前那么強大。 如果應用程序設置了多個警報,則這些警報的實際交付順序可能與其請求的交付時間的順序不匹配。 如果您的應用程序具有強大的訂購要求,則可以使用其他API來獲取必要的行為; 請參閱setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。

targetSdkVersion在API 19之前的應用程序將繼續獲得先前的警報行為:所有計划的警報將被視為准確。

資料來源: http //developer.android.com/reference/android/app/AlarmManager.html#set(int,long,android.app.PendingIntent)

請檢查這是否適合您的要求。

暫無
暫無

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

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