Использование Alarm Manager для запуска службы, но только если основное приложение не запущено

1

Хорошо, поэтому проблема здесь в том, что у меня есть видеокамера, которая подключена к телефону через Bluetooth. Вся связь с устройством осуществляется через службу android. Служба периодически обновляет камеру с помощью GPS-координат. Сервис, к сожалению, не написан моей компанией, и мы имеем только контроль над его запуском и отправкой его команд (однако он сам GPS, если подключен к устройству). Как только служба запускается нашим приложением, мы пытаемся подключиться к любым сопряженным устройствам, которые содержат мои компании OUI. Как только устройство отключится (возможно, его выключили или батарея разрядилась), он не будет автоматически подключен, пока пользователь не запустит наше приложение. Таким образом, координаты GPS не будут отправляться на камеру в этом сценарии.

Это проблема, потому что пользователь (который ничего не знает об этих услугах и что не так) подумает, должен ли он включить устройство обратно на него, должен быть подключен.

Поэтому я думал, что могу использовать AlarmManager с широковещательным приемником или службой (возможно, услугой намерения, потому что для завершения соединения требуется несколько секунд). Возможно, через несколько минут я смогу проверить подключение к камере. Если его настоящее только что прекратилось, а если не пытаться подключиться (если есть сопряженные устройства).

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

Теги:
android-service
alarmmanager
intentservice

2 ответа

1
Лучший ответ

Ответ Binyamin Sharet был хорош, но, к сожалению, он не разрешил мою проблему, потому что, когда приложение больше не видно или используется, оно все еще может работать, и приложение довольно эффективно отключается. Еще одно замечание - когда запускается ваш сервис/слушатель или любой другой компонент, который будет создавать экземпляр класса Application, который может сделать вещи сложными.

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

Это оказалось намного проще сделать, просто записав общие настройки в состояние (занято/не занято) и проверив, что в моем коде, который запускался из диспетчера аварийных сообщений. Это было немного дополнительного состояния, которое я не хотел, но на самом деле было не слишком сложно.

Я использовал commonsware бодрствующее намерение просыпаться каждую минуту и делать следующее:

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

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

Единственные реальные улучшения, о которых я могу думать, это:

  1. Если я уже подключен, перестаньте пробуждать обслуживание каждую минуту, пока он не отключится.
  2. когда Bluetooth отключен, перестает просыпаться. После повторного включения начните попытку снова подключиться каждую минуту. Я считаю, что есть способ получить уведомление, когда bluetooth включен с помощью фильтров намерений.

Для простоты я еще не реализовал их.

1

Я бы предложил следующий метод:

  1. Установите будильник, чтобы начать обслуживание за X минут
  2. Немедленно установить таймер для приложения на X-1 минуту
  3. Когда таймер приложения истекает: отмените ток и установите новый сигнал тревоги для службы и новый таймер для приложения.

Таким образом, служба не запускается, если приложение все еще работает, и после выключения приложения аварийный сигнал не будет остановлен.

  • 0
    Я немного запутался, когда эти вещи происходят, можете ли вы уточнить? Когда вы говорите, установите Alarm для запуска службы через X минут, это из моего приложения или что-то, что работает, скажем, при загрузке? Является ли X только интервалом, который я планирую использовать (поэтому, если это было только 2 минуты, я установил его запуск через 1 минуту). Я предполагаю, что делаю это из своего приложения, я бы поместил это в Activity или, скажем, в мой класс Application?
  • 0
    Я имел в виду ваше заявление. Лучше установить его из самого приложения, а не из действия, так как вы можете переходить от одного действия к другому во время использования приложения. Когда я говорю X, я имею в виду интервал, но не устанавливаю его повторение, а когда он вызывается, сбрасываю его.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню