Приложения для мониторинга 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 были веские причины убить службу.
С некоторыми службами может потребоваться еще больше шагов, но в этом случае этот подход представляется достаточным.