PhoneStateListener onSignalStrengthsChanged перестает вызываться в службе - PullRequest
8 голосов
/ 05 декабря 2011

Я пишу простое приложение, содержащее два элемента - Сервис и Активность.Активность используется только для запуска и остановки сервиса.Сервис использует PhoneStateListener для получения информации о текущих CellID, LAC и RSSI (уровень сигнала) и записи их в файл.

Все работает нормально, когда телефон не спит.Я заметил, что после выключения экрана и нескольких минут бездействия мой PhoneStateListener больше не вызывается.Я попытался добавить PARTIAL_WAKE_LOCK (и другие типы блокировок) в мой сервис, но я предполагаю, что это вызывает серьезную разрядку батареи и не должен использоваться таким образом.С другой стороны, это мне не очень помогло.Моя другая попытка состояла в том, чтобы использовать Таймер и отменить регистрацию / регистрацию моего PhoneStateListener через указанные интервалы.Неожиданно, похоже, что этот способ помог с обновлением CellId и LAC (так что я думаю, что onCellLocationChanged() от моего слушателя был вызван), но уровень сигнала все еще не обновился.

Я не пробовал использоватьBroadcastReciever, но после некоторого изучения темы и чтения тем на SO, я не думаю, что это будет работать для меня.

Подводя итог, мой вопрос: почему методы PhoneStateListener не вызываются, когда телефонво сне?Есть ли способ (например, заставить телефон проснуться или использовать другой механизм), чтобы эффективно преодолеть это поведение?

Ответы [ 2 ]

7 голосов
/ 19 января 2012

Когда экран выключен, андроид перестает уведомлять об изменении ячейки и сигнала.Это происходит путем отключения уведомлений URC на уровне RIL.Насколько я знаю, вы не можете получать обновления без включения экрана.Приемник вещания не будет работать по-другому.

Так что, если это удобно для вас, я бы предложил включить экран всякий раз, когда вы хотите проверить эти значения.Вы можете сделать это, получив блокировку пробуждения и предоставив флаги: ACQUIRE_CAUSES_WAKEUP |SCREEN_DIM_WAKE_LOCK

Редактировать: Перерегистрация слушателя фактически приведет к выполнению изменения местоположения, но не передает текущую информацию о ячейке, только последнюю известную информацию о ячейке доэкран гаснет.Чтобы получить текущую информацию о ячейке, вам все равно нужно будет включить экран.

1 голос
/ 13 мая 2012

вызов в начале:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "call_lock");

и в конце:

wakeLock.release();

вам необходимо разрешение:

<uses-permission android:name="android.permission.WAKE_LOCK" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...