Как запустить одиночную (общую) службу в библиотеке для нескольких приложений?
Я написал библиотеку, запускающую службу в фоновом режиме. Он отлично работает во всех приложениях.
Чтобы уменьшить использование ОЗУ, я хочу избежать использования нескольких сервисов для разных приложений. На самом деле, это достаточно, чтобы использовать только одну услугу, чтобы все было сделано.
Во-первых, я написал файл AIDL, чтобы сделать IPC между приложениями/библиотеками. Определена служба, экспортированная/разрешенная с разрешением подписи. Поскольку все приложения являются точно такой же службой, невозможно проверить, не вставлен ли какой-либо из них. При связывании службы для проверки состояния службы она всегда создает и уничтожает собственную услугу из-за природы флага BIND_AUTO_CREATE. Поэтому невозможно получить какую-либо информацию из экспортируемой службы, если она действительно запущена.
Затем я попытался определить Content Provider для манифеста библиотеки. Моя цель - обмениваться информацией об услугах через нее. Это действительно хороший механизм для связи между экспортированным сервисом и основным процессом приложения. Но он не может использоваться для нескольких экземпляров. Поскольку приложения, которые получают информацию поставщика контента из библиотеки, используют один и тот же авторитет, и поэтому невозможно установить второй. Он дает ошибку DUPLICATE_PROVIDER_AUTHORITY.
Какое ваше предложение по этому вопросу? Есть ли возможность создать механизм "ведущий/ведомый"? Можно ли сделать сервис singleton для приложения использующим проект библиотеки?
P.S: Проработаны методы вещания и общих предпочтений. Но они не эффективны для прослушивания обратного вызова из экспортируемой службы.
Ответы
Ответ 1
Вам нужно поместить Service
в собственный APK. Он должен иметь свое собственное уникальное имя пакета (в манифесте), которое отличается от имен пакетов любого из приложений, которые его используют. Вот как вы делаете Service
, как одиночный. Теперь вы можете использовать AIDL и привязать к Service
, чтобы иметь двустороннюю связь.
Обратите внимание, что в более поздних версиях Android возникла необходимость запуска Service
с использованием Явного Intent
(то есть: Component
должен быть явно указан, t используйте только ACTION).
Ответ 2
Альтернатива 1:
- Если вариант использования разрешает, я думаю, что вы не должны внедрять Сервис.
Сделайте свой клиент внедрить службу, чтобы вызвать код вашей библиотеки. Эта
как работает MediaPlayer и другие API-интерфейсы Android по умолчанию.
Альтернатива 2:
- Передайте эту услугу в отдельном приложении.. и загрузите приложение, когда
первый звонок производится от любого клиента. Отсюда и дальше будет
единственная служба, обрабатывающая весь клиентский запрос. Вот как некоторые API, такие как adobe
воздух /MDM от работ Airwatch.
Нет хорошего способа управлять компонентом, который работает в другом приложении, за исключением использования широковещательных приемников и всех.