Приложения для мониторинга Android

Я хотел бы создать приложение для Android с функциями мониторинга в реальном времени. Одной функцией мониторинга является аудит аудиопотока. Другая функция - взаимодействовать с периферийным датчиком. Эти функции мониторинга могут запускаться другими. Кроме того, для экономии энергопотребления звуковая функция будет работать в режиме опроса, т.е. Сон в течение определенного времени и пробуждения в течение определенного времени.

Я рассматриваю, как разработать приложение для Android.

  • Следует ли проектировать аудиофункцию как услугу или активность? Проблема в том, что если она спроектирована как Activity, звуковая функция отключится, если экран отключится через некоторое время.

  • Как создать функцию опроса? Используйте AlarmManager или внутренний поток с таймером?

Моя цель - максимально экономить энергопотребление. Спасибо.

Ответ 1

Я бы рекомендовал следовать

a) Используйте Сервис. Активность - это короткоживущая сущность (она работает только во время ее просмотра)

b) Сделайте сервис переднего плана (прочтите следующее: http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification). Это уменьшит вероятность того, что система убьет ваш сервис

c) В службе запустите поток и сделайте все, что нужно в потоке.

d) Если вы хотите выполнить периодически, просто выполните Thread.sleep() в потоке (когда Thread спит, он не потребляет циклы процессора).

Я считаю, что c) и d) предпочтительнее AlarmManager. Вот фрагмент документации (http://developer.android.com/reference/android/app/AlarmManager.html): "Примечание. Диспетчер аварийных сигналов предназначен для случаев, когда вы хотите, чтобы ваш код приложения выполнялся в определенное время, даже если ваше приложение в настоящее время не запущено. Для обычных операций синхронизации (тиков, тайм-аутов и т.д.) проще и эффективнее использовать Handler.

Так как ваше приложение работает, лучше иметь некоторый постоянный поток и выполнить что-то на нем. Вообще говоря, Handler, HandlerThread, MessageQueue являются просто удобными классами для более сложной обработки сообщений и планирования. Похоже, ваш случай довольно прост и обычный Thread должен быть достаточно.

Ответ 2

Соглашаясь с Виктором, вы определенно хотите использовать Сервис и закрепить его в памяти, позвонив startForeground()

Однако я предлагаю вам изучить использование встроенной системы Handler; разместите свою функциональность в Runnable и вызовите mhandler.postDelayed(myRunnable, <some point in future>); это позволит платформе Android максимально использовать управление питанием.

Ответ 3

Это сервис.

И вам может понадобиться дополнительная надежность: служба может быть убита и НЕ перезапущена позже, даже будучи передним сервисом. Это остановит ваш мониторинг.

Запустите службу с пользовательского интерфейса. Если вы хотите, чтобы служба выдержала перезагрузку устройства, также запустите ее из BroadcastReceiver для android.intent.action.BOOT_COMPLETED.

Создайте поток в службе, как описано в других ответах здесь.

Кроме того, используйте диспетчер аварийных сигналов, чтобы периодически снова запускать службу. Несколько вызовов startService() - это нормально. Если он уже запущен, служба будет продолжать работать. Но если он был забыт системой, скажем, после ряда условий с низким ресурсом, он будет перезапущен.

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

С некоторыми службами может потребоваться еще больше шагов, но в этом случае этот подход представляется достаточным.