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