Как запустить одиночную (общую) службу в библиотеке для нескольких приложений?

Я написал библиотеку, запускающую службу в фоновом режиме. Он отлично работает во всех приложениях.

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

Во-первых, я написал файл 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.

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