NotificationListenerService并在工作期间保持设备唤醒

时间:2014-02-11 19:03:24

标签: android push-notification android-notifications wakelock android-wake-lock

我正在扩展NotificationListenerService以便捕获发布到设备的通知。这一直工作得非常好,没有做任何特别的事情(比如使用唤醒锁)。我曾经使用后台线程做一些工作(做HTTP帖子)。

最近我开始在服务中做更多的工作(在唤醒时在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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

不知道垃圾收集器(我猜所有的运行都会立刻发生)

您可以尝试委托给WakefulIntentService。它包含一个唤醒锁,涵盖onReceive()doWakefulWork()之间的差距 你必须覆盖它。它将委托给一个线程并在完成时释放锁。 如果 onNotificationPosted唤醒CPU,那么您可能需要在那里使用WIS。

但似乎更有可能只是电话没有被唤醒

请参阅: