Лучшие практики для трансляций, ContentProviders и ContentRecievers - PullRequest
1 голос
/ 29 сентября 2011

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

У меня есть удаленная служба, которая работает на переднем плане моего телефона, которая может отправлять и получать информацию с других устройств Android по сети Wi-Fi.APK на телефоне, созданные для использования этой службы, содержат несколько баз данных SQLite.Я хочу, чтобы эти APK регистрировали там контент-провайдеров в сервисе, чтобы сервис всегда знал, куда поместить данные, которые он получает (я выполнил эту задачу).Когда данные поступают, я идентифицирую их местоположение и помещаю в нужную БД (здесь нет проблем).Итак, что было бы лучшим способом сообщить правильную активность, что новые данные были получены.Нужно ли регистрировать радиовещательные приемники, чтобы моя служба могла звонить?Будут ли работать Broadcast Receivers, если APK был убит ОС?После загрузки правильного действия я буду использовать обозреватель контента для отображения новых данных?Зачем мне использовать IntentServices?

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

1 Ответ

4 голосов
/ 29 сентября 2011

Если вы спрашиваете, как лучше для текущей операции узнать, что данные изменились в ContentProvider, из которого она читает, то ответом будет ContentObserver.

Допустим, для примера, у вас есть набор операций и поставщиков контента.Упражнение A представляет собой представление списка элементов из контент-провайдера A, и это представление списка заполняется с помощью CursorAdapter некоторого вида.Всякий раз, когда у вас есть запрос к ContentProviders CONTENT_URI, курсор должен автоматически отслеживать CONTENT_URI на предмет изменений через ContentObserver.

Причина, по которой это работает, заключается в том, что в ContentProvider:

  1. Ваш метод запроса вызывает setNotificationUri для вашего курсора на URI, который был запрошен.
  2. Всякий раз, когда происходит изменение в методе вставки / обновления / удаления, вы вызываете notifyChange для URI.

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

В вашей ситуации кажется, что большинство действий будут в отдельных APK.Если это так, вы, вероятно, захотите разослать широковещательные материалы, чтобы сообщить об изменениях всей системе.Если эти изменения имеют значение только во время выполнения действия, вы можете зарегистрировать BroadcastReceiver на весь срок действия действия, которое заботится об изменении.В качестве альтернативы вы можете поместить BroadcastReceiver в манифест приложения и всегда получать это изменение.

Это приводит нас к IntentServices.IntentServices - это самый «простой» способ обработки долгосрочных задач в Android.Все, что они делают, - это создают фоновый поток, который будет обрабатывать намерения, отправляемые в службу.Обычный вариант использования выглядит следующим образом:

  1. Вы получаете широковещательное намерение, на которое нужно отреагировать (и это займет некоторое время)
  2. Отправить направленное намерение (намерение сустановите имя компонента) в IntentService с некоторой информацией из намерения вещания.
  3. IntentService либо порождает новый поток BG, либо добавляет намерение в очередь обработки в существующем потоке BG
  4. Функция onHandleIntent вызывается в IntentService, так что теперь вы можете обрабатывать это изменение, используястолько времени обработки, сколько вы хотите.
...