【问题标题】:NotificationListenerService and keeping device awake during workNotificationListenerService 并在工作期间保持设备唤醒
【发布时间】:2014-02-11 19:03:23
【问题描述】:

我正在扩展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

我做错了什么?

【问题讨论】:

  • 您确定确实调用了onNotificationPosted 吗?你的意思是说之前(你正在使用后台线程)onNotificationPosted 被调用而现在没有被调用?这是相当不可能的。也许您在设计中更改了其他内容。有了这个信息,唯一合乎逻辑的假设是onNotificationPosted 在电话处于睡眠状态时根本不会被呼叫,但您需要

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


【解决方案1】:

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

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

但似乎更有可能只是手机没有被唤醒

见:

【讨论】:

  • 感谢您的回复。我一直在摆弄我的代码。我已经移除了唤醒锁,奇怪的是它现在似乎更稳定了。到目前为止没有任何延误。知道这怎么可能吗?
  • @ndsc:不知道 - 你必须确保onNotificationPosted 唤醒电话 - 在谷歌问?一旦你这样做了,在你的代码中做一个最小的改变,重新添加锁(在一个 git 分支中),然后再次检查。这一切都有可能产生安慰剂效应,所以要小心:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多