2013-05-22 115 views
0

問題是 BroadcastReceiver的方法通常會被AlarmManager「呼叫」,直到用戶喚醒設備。AlarmManager未在空氣模式下喚醒電話(onreceive延遲)

這從來沒有發生過我,只有我得到的信息是來自用戶發送的報告。在日誌中,我看到在第一種情況下onReceive方法調用被延遲了將近2小時,第二種情況下延遲了大約20分鐘。在這兩種情況下,緊接在用戶喚醒電話之後,鬧鐘(和onReceive)就開始了。

連續兩天出現問題兩次,用戶說它以前從未發生過。只有手機設置的獨特變化是啓用了空氣模式。

我的代碼:

報警設置,如:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); 
Logger.log("posting alarm " + id + " for " + formatTime(timeInMillis); 

廣播接收機的onReceiveMethod:從用戶接收

@Override 
public void onReceive(Context context, Intent intent) { 
    Logger.initialize(context, "AlarmReceiver"); 
    ... 
} 

日誌:

481. 20/05 13:00:04 v89: posting alarm 4 for 7:0 (in 17:59) 
486. 21/05 08:58:00 v89: logger initialized again from AlarmReceiver 

536. 21/05 09:04:54 v89: posting alarm 4 for 7:0 (in 21:55) 
541. 22/05 07:22:24 v89: logger initialized again from AlarmReceiver 

是否有可能爲空氣以某種方式阻止手機覺醒的模式?我可以預防它嗎?或者它可能完全不同?歡迎任何幫助。

設備是三星Galaxy SIII(GT-I9305)採用Android 4.1.2

編輯: 只是在拖延可能被記錄器以某種方式造成的情況下,這裏是它的代碼。 mHandler是使用HandlerThread創建的,所以我相信它不能阻止onReceive,對不對?

public synchronized static void initialize(Context context, String src) { 
    if (mInstance == null) {//wasn't null 
     ... 
    } else { 
     Logger.log("logger initialized again from " + src); 
    } 
} 

public synchronized static void log(final String text) { 
    Log.d(TAG, text); 
    if (mInstance != null && mInstance.mLoggingEnabled) { 
     mInstance.mHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       //some database operations 
      } 
     }); 
    } 
} 
+0

嗨科格,做你曾經找到過這個問題的解決方案嗎? – ChriPf

+0

@ChriPf我無法重現它。此外,我失去了與用戶的聯繫,並且錯誤再也沒有報告過 – Koger

回答

0

如果你想安排與指定的時間間隔你的任務不使用標誌AlarmManager.RTCAlarmManager.RTC_WAKEUP與方法alarm.setRepeating(...)。因爲在這種情況下,鬧鐘將被綁定到設備的實時時鐘。所以改變系統時間可能會導致警報不當。您必須使用標誌AlarmManager.ELAPSED_REALTIMEAlarmManager.ELAPSED_REALTIME_WAKEUP。在這種情況下,SystemClock.elapsedRealtime()將作爲安排警報的基礎。

的代碼如下:

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + checkIntervalMillis, checkIntervalMillis, pendingIntent); 

如果您希望在設備處於休眠模式,我建議由CommonsWare使用WakefulIntentService庫來執行你的長期運行的任務:https://github.com/commonsguy/cwac-wakeful

+0

感謝您對使用ELAPSED_TIME的評論 - 我實際上在電話時間改變後開始報警。至於第二部分 - 我在稍後在onReceive中創建了WakeLock - 問題看起來像onReceive沒有按時調用。我添加了Logger.initialize的代碼 - 它似乎不是一個長時間運行的任務,是嗎? – Koger

+0

我有一個建議。如果用戶在設置鬧鐘後關閉手機,則此鬧鐘將被取消。所以如果你有BOOT_COMPLETED接收器重新安排你的鬧鐘,你可以看到你描述的行爲。用戶重新啓動手機後,鬧鐘將安排在比預期晚的時間。 – makovkastar

+0

那不是它 - 重新啓動也被記錄下來 – Koger

相關問題