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分支中说)做一个微小的改变,然后再次检查。这一切都有安慰剂效应的可能性,所以小心:) –