2014-02-08 46 views
3

我希望AlarmManager每天上午10:30根據用戶移動設備時間被解僱。它確實在上午10點30分發射,但問題在於上午10點30分之後,它會在每半小時或任何不尋常的時間間隔之後重複沒有時間。

如何預防此問題?我在成功登錄並註冊ButtonCick()事件時致電此問題。如果用戶註銷,我也想停止此操作。

我的代碼如下:AlarmManager不能及時開火

 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(); 
     } 
+0

你的targetSdkVersion是什麼? – user2450263

+0

targetSdkVersion是19 –

回答

3

代碼似乎罰款。如果目標的版本是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)

請檢查是否適合您的需求。

+0

感謝您的回覆。我會檢查出來,讓你知道它是否適合我。 –

+0

它爲你工作:) – user2450263