NotificationListenerService и поддержание активности устройства во время работы

Я расширяю NotificationListenerService, чтобы перехватывать публикуемые уведомления. к устройству. Это работало отлично, не делая ничего особенного (например, используя wakelocks). Раньше я использовал фоновый поток для выполнения некоторой работы (отправки HTTP-сообщений).

В последнее время я стал больше работать в Службе (около 1 секунды работы ЦП на Nexus 4 при пробуждении) и отключил фоновый поток.

Я заметил, что иногда устройство не просыпается для выполнения работы, делая это через несколько минут или сразу же, когда я снова включаю экран. Я добавил частичную блокировку пробуждения, надеясь, что это решит проблему. К сожалению, он по-прежнему показывает случайное поведение.

Любая идея, как я могу отладить это дальше, и может ли кто-нибудь сказать мне, правильный ли мой подход?

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();
}

Редактировать:

Похоже, wakelock отключается преждевременно. Это заканчивается тем, что эти два сообщения рассылаются спамом в 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

Что я делаю не так?


comment
Вы уверены, что onNotificationPosted действительно называется ? Вы хотите сказать, что раньше (что вы использовали фоновый поток) onNotificationPosted вызывался, а теперь нет? Это довольно маловероятно. Возможно, вы изменили что-то еще в своем дизайне. С этой информацией единственное логическое предположение состоит в том, что onNotificationPosted просто не звонят, когда телефон спит, но вам нужно   -  person Mr_and_Mrs_D    schedule 13.02.2014


Ответы (1)


Не знаю про сборщик мусора (думаю, все прогоны происходят сразу)

Вы можете попробовать делегировать WakefulIntentService. Он содержит блокировку пробуждения, которая покрывает промежуток между onReceive() и doWakefulWork(), который вы должны переопределить. Он делегирует поток и освобождает блокировку по завершении. Если onNotificationPosted пробуждает ЦП, возможно, вам потребуется использовать там WIS.

Но кажется более вероятным, что просто телефон не проснулся

Видеть:

person Mr_and_Mrs_D    schedule 12.02.2014
comment
Спасибо за ваш ответ. Я еще немного повозился со своим кодом. Я удалил wakelock, и, как ни странно, теперь он работает более стабильно. Задержек пока нет. Любая идея, как это возможно? - person ndsc; 15.02.2014
comment
@ndsc: понятия не имею - что вы должны убедиться, что onNotificationPosted разбудит телефон - спросите в Google? Как только вы это сделаете, внесите минимальное изменение в свой код, повторно добавив блокировки (скажем, в ветку git), а затем снова проверьте. Во всем этом возможен эффект плацебо, так что будьте осторожны :) - person Mr_and_Mrs_D; 15.02.2014