Android StartActivtyForResult () из службы - PullRequest
1 голос
/ 30 сентября 2011

Сначала я извиняюсь за мой английский, который не так хорош :).

У меня возникла проблема при разработке приложения.

Это общая схема архитектуры моего решения.

http://i.stack.imgur.com/ooTmE.png

Чтобы быть быстрым, приложение должно декодировать код голым, но двумя возможными способами:

  1. с использованием внешнего устройства (конструктор предоставляет SDK, содержащий службу Android для связи с устройством),
  2. используйте камеру мобильного телефона с помощью библиотеки Zxing, которая позволяет управлять ею с намерением.

Цель моей службы - управлять бизнес-кодом и делать выбор инструмента для пользователя прозрачным.

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

Моя главная проблема в том, что я не могу выполнить StartActivityForResult внутри службы.

Есть ли у кого-нибудь предложения по моей проблеме, будь то изменение архитектуры или решение основной проблемы?


@ Laurent ': Вы имеете полное право на то, что мой сервис выступает в роли адаптера API.

Я постараюсь прояснить ожидаемое поведение.

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

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

Дело в том, что он не выбирает способ сделать признание. Вот почему, как вы сказали, я реализую адаптер.

Адаптер выбирает между:

Камера мобильного или внешнего устройства. Первое - это поступление из библиотеки Zxing. Второй - это сервис, который управляет внешним устройством. Этот сервис предоставляет интерфейс для возврата результата.

Еще одна вещь, мне нужно, чтобы вся моя реализация (adapter and co) могла быть повторно использована другими приложениями, которые также должны будут выполнять распознавание.

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

Надеюсь, вы понимаете мою проблему.

Ответы [ 3 ]

1 голос
/ 01 октября 2011

Учитывая вашу архитектуру, ваш MyOwnService должен выступать в качестве адаптера API: он должен предоставлять унифицированный API-интерфейс сканирования и прозрачно учитывать особенности каждого внешнего сервиса.

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

Пассивное сканирование:

  • Даже если есть некоторые обходные пути: никакие действия не должны запускатьсяиз услуги (не напрямую ).Никогда.Плохой.Службы являются второстепенными, максимум, что им будет разрешено, это подсказка пользователей с Notifications (это пункт 2 отличного ответа Джастина).

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

Активное сканирование:

  • Внутрипо своему усмотрению вы можете bind обратиться к вашему сервису-обёртке и заставить его начать поиск кодовых панелей.Когда он находит его, он должен message вашей активности.Ваша активность message handler имеет полный доступ к пользовательскому интерфейсу для информирования пользователя о ваших результатах.

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

Вы НЕ делаете это, запускаяновое действие (помните: это плохо), но вы можете bind к службе и / или использовать Messages между службой оболочки и приложением.

Я советую вам потратить время на чтение (и многое другоевремя для понимания) эта статья для разработчиков Android о BoundServices и особенно часть о Messengers.

Полный пример двухстороннего обмена сообщениями между службой и действиемможно найти в следующих примерах для Android: Сервис & Активность

Предупреждение: разработка надежных, полноценных служб на основе AIDL - сложная задача.

1 голос
/ 04 октября 2011

Итак, наконец, я изменил свою архитектуру.

Я решаю удалить myOwnService и создать промежуточное действие, которое будет моим API-адаптером.

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

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

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

Служба не была хорошим выбором.

Большое спасибо за вашу помощь и ваше время.

1 голос
/ 30 сентября 2011

Два способа решить эту проблему.

1) Попросите MyOwnService перезвонить в MainActivity и попросить запустить ScanActivity. - Это лучший подход, если задача MyOwnService будет выполняться только во время работы MainActivity и если пользователь ожидает, что ScanActivity запускается автоматически.

2) Пусть MyOwnService создаст уведомление, которое позволит пользователю получить доступ к ScanActivity. - Это лучший подход, если задача MyOwnService может выполняться дольше, чем срок службы MainActivity. Таким образом, вы можете незаметно сообщить пользователю, что он может захотеть получить доступ к ScanActivity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...