12

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

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

Во-первых, я написал файл AIDL, чтобы сделать IPC между приложениями/библиотеками. Определена служба, экспортированная/разрешенная с разрешением подписи. Поскольку все приложения являются точно такой же службой, невозможно проверить, не поднял ли кто-нибудь или нет. При связывании службы для проверки состояния службы она всегда создает и уничтожает собственную услугу из-за природы флага BIND_AUTO_CREATE. Вот почему невозможно получить какую-либо информацию от экспортируемой службы, если она действительно работает и работает.

Затем я попытался определить поставщика контента для манифеста библиотеки. Моя цель - обмениваться информацией об услугах через нее. Это действительно хороший механизм для связи между экспортированным сервисом и основным процессом приложения. Но он не может использоваться для нескольких экземпляров. Поскольку приложения, которые получают информацию поставщика контента из библиотеки, используют один и тот же авторитет, поэтому установить второй вариант невозможно. Он дает ошибку DUPLICATE_PROVIDER_AUTHORITY.

Что вы предлагаете по этому поводу? Есть ли возможность создать механизм «ведущий/ведомый»? Возможно ли, чтобы служба singleton для приложения использовала проект библиотеки?

P.S: Пробовал методы вещания и общих предпочтений. Но они не эффективны для прослушивания обратного вызова из экспортируемой службы.

+0

Вы могли бы поделиться решением, которое у вас было, пожалуйста? Даже если это было не идеально для того, что вы хотели ... Вы сказали в комментарии «Я завершил свою реализацию с широковещательными приемниками (используя разрешение подписи)». Было бы интересно посмотреть, как вы справились с этим. – brandall

ответ

5

Вам нужно поставить Service в собственный APK. Он должен иметь свое собственное уникальное имя пакета (в манифесте), которое отличается от имен пакетов любого из приложений, которые его используют. Вот как вы делаете Service себя как одиночный. Теперь вы можете использовать AIDL и привязать к Service, чтобы иметь двустороннюю связь.

Обратите внимание, что в более поздних версиях Android, это стало необходимым, чтобы начать Service используя явноеIntent (то есть: Component должно быть явно указано, вы не можете использовать только одно из следующих действий).

+0

Спасибо за объяснение. Но я просто автор библиотеки, а не приложение. Моя библиотека предоставляет уникальное решение для клиента. Сейчас это хорошо работает. Со своей стороны, нет возможности узнать имена приложений, данные и т. Д. Каждый клиент может использовать его в своих приложениях. Мне нужно решение на стороне библиотеки. – StillHopeForMe

+0

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

+0

Тогда вы ничего не можете сделать. Вам придется жить с несколькими «Сервисами», поскольку они не могут общаться или знать друг о друге. В любом случае, в конечном итоге вы получите кошмар с разрешениями/безопасностью. Сожалею. –

0

Альтернатива 1:

  • Если Прецедент позволяет я думаю, что вы не должны осуществлять обслуживание. Сделайте ваш клиент реализующим службу вызовом вашего кода библиотеки. Этот - это то, как работают MediaPlayer и другие API-интерфейсы по умолчанию.

Альтернатива 2:

  • Узел службы в отдельном app..and загрузить приложение, когда первого вызова из любого клиента. Отныне будет единая услуга, обрабатывающая весь клиентский запрос. Именно так работают некоторые API, такие как adobe Air/MDM-решения от Airwatch.

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

+0

Я выполнил свою реализацию с широковещательными приемниками (используя разрешение на подпись). Спасибо за альтернативные решения. – StillHopeForMe

+0

@StillHopeForMe вы можете подробно остановиться на своем решении? –

 Смежные вопросы

  • Нет связанных вопросов^_^