0

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

В последнее время я начал делать больше работы в Службе (около 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(); 
} 

Edit:

Похоже, 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 

Что я делаю неправильно?

+0

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

ответ

0

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

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

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

См:

+0

. Спасибо за ваш ответ. Я еще кое-что проделал с моим кодом. Я удалил wakelock и, как ни странно, теперь кажется более стабильным. Никаких задержек до сих пор. Любая идея, как это возможно? – ndsc

+0

@ndsc: понятия не имею - вам нужно убедиться, что 'onNotificationPosted' разбудит телефон - спросите у Google? Как только вы сделаете это, сделайте минимальное изменение в вашем коде, повторно добавив блокировки (в ветке git сказать), а затем снова проверьте. Существует возможность плацебо-эффекта с этим все, так осторожно :) –

 Смежные вопросы

  • Нет связанных вопросов^_^