0

爲擴大NotificationListenerService的範圍,以捕獲發佈到設備的通知。這一直工作得很好,沒有做任何特別的事情(比如使用喚醒鎖)。我曾經使用後臺線程做一些工作(做HTTP帖子)。NotificationListenerService並讓設備在工作期間保持清醒狀態

最近我已經開始在服務中做更多的工作(在Nexus 4上大約1秒的CPU工作),並且我放棄了後臺線程。

我注意到,有時候設備不會因爲做這項工作而被喚醒,會在幾分鐘後或者當我重新開啓屏幕時立即執行。我已經添加了一個部分喚醒鎖,希望能解決問題。可悲的是它仍然表現出隨機行爲。

任何想法如何我可以進一步調試此任何人都可以告訴我,我的方法是否正確?

PowerManager.WakeLock wakeLock; 

static String wakeLockTag = "NotificationListenerWakeLock"; 

@Override 
public void onNotificationPosted(StatusBarNotification sbn) { 
    acquireWakeLock(); 

    // Do work 

    releaseWakeLock(); 
} 

private void acquireWakeLock() { 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 

    if (wakeLock == null) { 
     wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakeLockTag); 
    } 

    if (!wakeLock.isHeld()) { 
     wakeLock.acquire(); 
    } 
} 

private void releaseWakeLock() { 
    if (wakeLock != null && wakeLock.isHeld()) 
     wakeLock.release(); 
} 

編輯:

貌似激活鎖定得到釋放過早。它結束在這兩條消息被垃圾郵件在LogCat約2分鐘:

02-11 20:12:19.557: D/dalvikvm(16564): WAIT_FOR_CONCURRENT_GC blocked 21ms 
02-11 20:12:19.617: D/dalvikvm(16564): GC_CONCURRENT freed 1032K, 10% free 19831K/21820K, paused 1ms+1ms, total 20ms 
02-11 20:12:19.617: D/dalvikvm(16564): WAIT_FOR_CONCURRENT_GC blocked 9ms 
02-11 20:12:19.677: D/dalvikvm(16564): GC_CONCURRENT freed 1075K, 10% free 19794K/21820K, paused 1ms+1ms, total 17ms 

我做錯了什麼?

+0

你肯定'onNotificationPosted'確實叫什麼名字?你的意思是說,之前(你使用的是後臺線程)'onNotificationPosted'被稱爲現在不是?這是相當不可能的。也許你在你的設計中改變了別的東西。有了這個信息,唯一合乎邏輯的假設是'onNotificationPosted'在電話睡眠時根本不會被調用,但您需要 –

回答

0

不知道垃圾收集器(我想所有的運行發生一次)

你可以嘗試委託給WakefulIntentService。它擁有一個喚醒鎖,它覆蓋了您必須覆蓋的onReceive()doWakefulWork() 之間的差距。它將委託給一個線程並在完成時釋放該鎖。 如果onNotificationPosted喚醒CPU,那麼您可能需要在那裏使用WIS。

但它似乎更可能是簡單的手機沒有喚醒

參見:

+0

感謝您的迴應。我一直在用我的代碼進行更多的操作。我已經移除了喚醒鎖,奇怪的是現在它似乎更加穩定。到目前爲止沒有延誤。任何想法如何這是可能的? – ndsc

+0

@ndsc:不知道 - 你必須確保'onNotificationPosted'喚醒了電話 - 在谷歌問?一旦你這樣做,你的代碼重新添加鎖(在git分支中說)做一個微小的改變,然後再次檢查。這一切都有安慰劑效應的可能性,所以小心:) –

相關問題