2013-03-16 2 views
6

Я создаю приложение, которое будет контролировать состояние батареи, подключение к Wi-Fi и данные о местоположении через равные промежутки времени и записывать результаты в файл (а затем отправлять их на сервер). При установке мониторинга приложения необходимо отключить, но пользователь, которому он нужен, должен пережить перезагрузку. После большого чтения я понял, что у меня есть в основном 2 варианта:Android-дизайн: работа в фоновом режиме или AlarmManager?

  • Подкласс Service и уволить его от моей деятельности. Установите его на переднем плане, STICKY, а что нет и надейтесь, что он не будет убит андроидом - и позаботьтесь, если андроид воссоздает его (на самом деле должно быть 3 службы, поэтому синхронизация между ними может быть беспорядочной). Запустите нить в сервисе (нет необходимости в Executors, я думаю) и получите ее Thread.sleep(REGULAR_INTERVAL). Просыпайтесь, собирайте данные, записывая их в файл. Передавайте собранную информацию и показывайте ее в моей деятельности, если она работает (которая будет зарегистрирована широковещательным приемником). Промыть и повторить while(true). У вас есть способ прервать это
  • У меня зарегистрирована активность PendingIntent с AlarmManager, которая будет запускать каждый REGULAR_INTERVAL. Я так долго не рассматривал технические детали этого подхода, но я надеюсь, что смогу сделать этот PendingIntent созданным и запущенным IntentService (похоже, это так, как надо), имея бесплатный механизм Thread, а также закрытие само по себе). Некоторый скелетный код для этого подхода будет приветствоваться.

Я думаю, что мне нужно зарегистрировать загрузочный приемник в обоих случаях, чтобы проверить Общие настройки (уже сделали это), и в случае, если 1 запустит сервис (ы), а в случае, если 2 зарегистрировать приемник для события тревоги и установите диспетчер аварийных сообщений вверх - это часть, в которой мне нужен какой-то скелетный код.

Итак - прежде чем я начну строить это - что было бы предпочтительным подходом?

В recap - приложение должно отслеживать некоторые свойства телефона и записывать их в файл до тех пор, пока пользователь не захочет его отключить.

+0

Ваших пользователи будут, вероятно, убьют вас, если вы держите 'живой постоянно осушение батареи' обслуживания своего телефона только для сбора данных купольных через определенные промежутки времени. Используйте второй подход, используя «IntentService» с дополнительными WakeLocks, если это необходимо (посмотрите на «WakefullIntentService» CommonsWare). – Luksprog

+0

@Luksprog: спасибо - мне нужны замки? в широковещательном приемнике, который получит сигнал тревоги (все еще глядя, как именно это должно быть реализовано)? –

+0

Почему отрицательный голос? –

ответ

6

в то время как в случае 2 зарегистрировать приемник для тревожного события и установить менеджер сигнализации до

Ваш приемник будет уже зарегистрирован с помощью манифеста.

, который был бы предпочтительным подходом?

AlarmManager, предполагая, что, как правило, REGULAR_INTERVAL прилично долго (например, в течение нескольких минут). В идеале этот интервал настраивается пользователем.

Если вы намереваетесь сделать это, даже если устройство в противном случае спит, ваш вариант № 1 просто не будет работать, если вы не держите WakeLock все время, что приведет к тому, что ваши пользователи захотят стрелять в вас с дробовиком.

Скелетный код для этого подхода был бы рад.

Here is a sample app демонстрирует использование AlarmManager для не _WAKEUP сигнализаций (то есть, вам нужно только эти события происходят в то время как устройство уже просыпаются по другим причинам).

Here is a sample app, демонстрирующий использование AlarmManager для _WAKEUP сигналов тревоги, используя my WakefulIntentService. WakefulIntentService (или что-то в этом роде) необходимо, потому что AlarmManager не позволяет устройству проснуться очень долго (достаточно долго для onReceive() из BroadcastReceiver), поэтому вам нужно предпринять дополнительные шаги, чтобы устройство просыпалось достаточно долго, чтобы вы могли Работа. Теоретически, ваша работа может быть достаточно быстрой, чтобы сделать только в onReceive()BroadcastReceiver, избегая необходимости возиться с WakefulIntentService. Тем не менее, вы будете делать диск ввода/вывода каждое из этих времен, что идеально не должно делаться в основном потоке приложения, где вызывается onReceive(). И когда вы загружаете свои данные, вам может понадобиться WakefulIntentService, так или иначе, если вы тоже хотите сделать это в фоновом режиме.

+0

Спасибо - зачем регистрировать BroadcastReceiver в манифесте (не Загрузите один - это должно быть там)? Разве это не означает, что он будет регистрироваться все время - что приводит к некоторым накладным расходам? Пока включен контроль над BootReceiver -> '? (зарегистрируйте приемник для тревоги, настройте будильник): return' выглядит более экономичным. Также AlarmReceiver будет работать в моем основном потоке пользовательского интерфейса? Это будет тот случай, когда моя активность (которая просто отображает собранные данные и позволяет включать/отключать мониторинг) - нет? В противном случае не было бы нити пользовательского интерфейса (или это не повлияло бы) - я ошибаюсь? –

+0

@Mr_and_Mrs_D: «зачем регистрировать BroadcastReceiver в манифесте» - в противном случае вам нужно постоянно поддерживать компонент (например, «Сервис»), что является отправной точкой для переключения на «AlarmManager». Вы делаете * не * хотите постоянно занимать память. «Разве это не означает, что он будет регистрироваться все время, что приведет к некоторым накладным расходам?» - он будет использоваться только вашим 'AlarmManager'. «И AlarmReceiver будет работать в моем основном потоке пользовательского интерфейса?» - 'onReceive()' 'BroadcastReceiver' вызывается в главном потоке приложения. – CommonsWare

+0

@Mr_and_Mrs_D: «В противном случае не было бы потока пользовательского интерфейса» - всегда существует «поток пользовательского интерфейса», более точно называемый «основным потоком приложения». Если вы тратите слишком много времени на основной поток приложений, даже из 'onReceive()', Android прекратит вашу операцию. – CommonsWare

0

В зависимости от длины повторяющейся задачи вы можете выбрать один из нескольких подходов. Этот вопрос обсуждает их - Scheduling recurring task in Android

Использование AlarmManager удобно, когда время ожидания задачи составляет 15 минут или дольше. Шаблон хорошо известен.

+0

@CommonsWare: У меня есть аналогичная ситуация для выполнения некоторой задачи (GPS-позиционирование) с интервалом в 1 мин. Я использую Handler для этого в своей основной деятельности, как это повлияет на мое приложение – Tushar

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