Если вы спрашиваете, как лучше для текущей операции узнать, что данные изменились в ContentProvider, из которого она читает, то ответом будет ContentObserver.
Допустим, для примера, у вас есть набор операций и поставщиков контента.Упражнение A представляет собой представление списка элементов из контент-провайдера A, и это представление списка заполняется с помощью CursorAdapter некоторого вида.Всякий раз, когда у вас есть запрос к ContentProviders CONTENT_URI, курсор должен автоматически отслеживать CONTENT_URI на предмет изменений через ContentObserver.
Причина, по которой это работает, заключается в том, что в ContentProvider:
- Ваш метод запроса вызывает setNotificationUri для вашего курсора на URI, который был запрошен.
- Всякий раз, когда происходит изменение в методе вставки / обновления / удаления, вы вызываете notifyChange для URI.
Если в вашей службе есть дополнительные данные, которые могут измениться, но это не такпривязан к ContentProvider, чем у вас есть несколько вариантов, как передавать данные.Если действие находится в том же APK, что и ваша служба, вы можете использовать какую-то статическую переменную, или контекст приложения, или какую-то другую пользовательскую форму связи.Методы здесь довольно либеральны, потому что вы работаете в одной и той же виртуальной машине, поэтому вам доступно много вещей.
В вашей ситуации кажется, что большинство действий будут в отдельных APK.Если это так, вы, вероятно, захотите разослать широковещательные материалы, чтобы сообщить об изменениях всей системе.Если эти изменения имеют значение только во время выполнения действия, вы можете зарегистрировать BroadcastReceiver на весь срок действия действия, которое заботится об изменении.В качестве альтернативы вы можете поместить BroadcastReceiver в манифест приложения и всегда получать это изменение.
Это приводит нас к IntentServices.IntentServices - это самый «простой» способ обработки долгосрочных задач в Android.Все, что они делают, - это создают фоновый поток, который будет обрабатывать намерения, отправляемые в службу.Обычный вариант использования выглядит следующим образом:
- Вы получаете широковещательное намерение, на которое нужно отреагировать (и это займет некоторое время)
- Отправить направленное намерение (намерение сустановите имя компонента) в IntentService с некоторой информацией из намерения вещания.
- IntentService либо порождает новый поток BG, либо добавляет намерение в очередь обработки в существующем потоке BG
- Функция onHandleIntent вызывается в IntentService, так что теперь вы можете обрабатывать это изменение, используястолько времени обработки, сколько вы хотите.