2014-10-21 5 views
2

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

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

static WakeLock 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, который я могу проверить, чтобы узнать, почему мое приложение остановилось?

+0

«Есть ли какие-либо механические взаимодействия, которые могут убить используемый вакелон, например, прикреплять шнур питания или USB-кабель?» - нет. «Почему мое приложение остановилось?» - потому что Android прекратил ваш процесс, скорее всего. Процессы не живут вечно. – CommonsWare

ответ

1

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

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

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

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

+0

жаль, что я немного опаздываю на это, но у меня такая же проблема, как и у ОП. Не могли бы вы опубликовать что-то о том, как переопределить этот метод finalize? Благодаря! Федерико. –