2013-01-09 58 views
1

我有一個鬧鈴應用程序。我通常知道接收器的生命週期以及如何使用WakeLock。BroadcastReceiver不會喚醒手機

今天,我被一個用戶聯繫過,他給我發了一個非常奇怪的日誌,並抱怨說他的鬧鐘還沒有開始,直到他自己解鎖了手機。在接收器完成工作並開始活動之前,我曾經遇到手機重新入睡的問題,但在接收器中創建WakeLock似乎解決了這個問題。至少直到今天 - 從日誌看來,onreceive方法似乎根本沒有被調用,直到用戶自己解鎖手機。

事實:

  • 它是第一種情況我也聽說過
  • 它已經發生了幾次給用戶,但不是每一次
  • 日誌由添加文本到SQLite數據庫準備。它似乎沒有以任何顯着的方式延遲應用
  • 來自onReceive的信息在預計的警報開始時間之後超過100秒被記錄。這是用戶解鎖了手機
  • 剛過我用AlarmManager.RTC_WAKEUP標誌
  • 用戶說,他沒有任何自定義ROM中的onReceive
  • 報警的第一個方法調用開始。我等待的答案,如果他有什麼自定義/鎖屏專用
  • 手機型號是索尼的XperiaüST25A,安卓4.0.4

任何想法可能是造成這個問題呢? BroadcastReceiver的「內部」WakeLock有可能無法工作嗎?

編輯:

我想在這裏強調的問題 - 廣播接收器應該保持清醒的手機它的整個的onReceive方法中。然而,在我的情況下,要麼

  • 手機落在的onReceive方法結束之前睡覺(甚至在完成「日誌調用」之前)
  • 手機是不是通過接收器在所有

也喚醒,我想指出一個事實,即用戶已經明確表示了 - 當他自己解鎖手機時,鬧鐘已經開始了。幾次。

一些代碼:

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

記錄儀方法:

public synchronized static void initialize(Context context, String text) { 
    try { 
     if (mInstance == null) { // this is the block that is runned 
      BugSenseHandler.initAndStartSession(context, BUGSENSE_ID); 
      mInstance = new Logger(context); 
      log("== Logger initialized == from " 
        + (text != null ? text : "")); // it stores times as well. Said 
                // that alarm was started over 100 
                // seconds after it should 
     } else { 
      log("logger initialized again from " 
        + (text != null ? text : "")); 
     } 
    } catch (Exception e) { 
     try { 
      BugSenseHandler.sendException(e); 
      mInstance = null; 
     } catch (Exception e2) { 
     } 
    } 
} 
+0

看看沒有人可以給你任何適當的幫助沒有一些代碼。 –

+0

@StefandeBruijn我有一些代碼以及解釋方式,我相信它沒有連接到問題導致 – Koger

+0

親愛的,看到我的答案在這篇文章http:// stackoverflow。com/questions/20113161/start-activity-screen-even-if-screen-is-locked-in-android/31772607#31772607 – Junaid

回答

0

WakefulIntentService從Commonsware

+0

看起來很有趣,但我仍然想知道爲什麼手機在完成onReceive之前就睡着了,雖然它應該保持清醒,直到它結束,至少根據文檔 – Koger

+0

好吧,我現在看到你的觀點。如果您在廣播接收器之外產生工作,則WakefulIntent服務類很有用,這似乎並非如此...我同意您的看法,根據Android文檔,AlarmManager包含一個喚醒鎖,可確保您的onReceive方法完成。這聽起來更像是AlarmManger沒有按計劃觸發的情況。當然,一些日誌消息可以幫助澄清這一點。 – EJK