Wakelock не всегда поддерживает мое приложение

Я сделал простое приложение службы отслеживания GPS для Android, чтобы регистрировать местоположение устройства в пассивном режиме. Чтобы ЦП продолжал работать, я использую блокировку пробуждения, но это ненадежно. Иногда приложение работает по 3 часа. Иногда он может выполнять полный 24-часовой цикл. Я не получаю никакого отчета о сбое на экране — приложение просто останавливается без каких-либо указаний. Срок службы батареи в порядке.

Я объявляю wakelock как основную переменную класса активности

static WakeLock wakeLock;

И установите блокировку один раз прямо перед запуском службы GPS.

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock((PowerManager.PARTIAL_WAKE_LOCK),"MyAppNameWakelock");
wakeLock.setReferenceCounted(true);
wakeLock.acquire();

По причинам смены экрана я также обновил функцию BackButton, чтобы она запускала moveTaskToBack(true); вместо обычных операций. Может ли это иметь какое-то отношение к этому?

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

Впоследствии, есть ли какой-либо журнал в Android, который я могу проверить, чтобы узнать, почему мое приложение остановилось?


person Greg    schedule 21.10.2014    source источник
comment
Существуют ли какие-либо механические взаимодействия, которые могут вывести из строя вейклок при использовании, например подключение шнура питания или USB-кабеля? -- нет. почему мое приложение остановилось? -- потому что Android, скорее всего, завершил ваш процесс. Процессы не живут вечно.   -  person CommonsWare    schedule 21.10.2014


Ответы (1)


Теоретически, если ваше приложение не умирает по какой-либо другой причине и имеет разрешения wakelock (см. здесь: <uses-permission android:name="android.permission.WAKE_LOCK" /> ), оно должно остаться в живых.

Независимо от того, удаляются ли пробуждения внешними событиями, это может зависеть от ядра и устройства. Некоторые ядра могут иметь очень агрессивные функции управления питанием, которые могут принимать решения об уничтожении вейклоков. Вы запустили свое приложение на большем количестве устройств?

Однако я бы исследовал, не убило ли мое приложение другое событие (например, увеличение использования памяти).

Другой идеей было бы переопределить метод finalize и напечатать сообщение, когда сборщик мусора недоступен для пробуждения, чтобы определить, когда он умер.

person VAndrei    schedule 21.10.2014
comment
извините, я немного опоздал, но у меня та же проблема, что и у ОП. Не могли бы вы опубликовать что-нибудь о том, как переопределить этот метод финализации? Спасибо! Федерико. - person Federico Alvarez; 30.11.2017