Служба в другом процессе, но в том же apk, что и основное приложение, могут ли они легко обмениваться данными? - PullRequest
0 голосов
/ 26 сентября 2019

Если у меня есть приложение и сервис в apk.Хотя служба работает в другом процессе, отличном от основного приложения, используя атрибут android:process=":SomeService" в теге - Может ли служба распространять данные в главное приложение, например, через LiveData или LocalBroadcastManager, которые могут быть легко переданы в любое место в программе, или мне нужноиспользуйте какой-нибудь механизм на основе IPC, такой как Intents или .aidl или что-то еще.Я надеюсь, что вы скажете, что существует простой способ обмена данными, но я подозреваю, что вы скажете, что, поскольку они находятся в разных процессах, простого способа сделать это не существует.Я хотел бы избежать всех накладных расходов с помощью Intents, или .aidl, или чего-либо еще. Следует также сказать, что есть особая причина, по которой я хочу, чтобы служба находилась в другом процессе.

1 Ответ

1 голос
/ 27 сентября 2019

Может ли служба распространять данные в основное приложение, например, через LiveData или LocalBroadcastManager, которые могут быть легко переданы в любое место в программе, или мне нужно использовать какой-либо механизм на основе IPC, такой как Intents или .aidl, или любой другой

Таким образом, если для вашей службы объявлено android:process и если имя, присвоенное этому атрибуту, начинается с двоеточия (':'), то при необходимости создается новый процесс, и службаработает в этом процессе.

Вам необходимо использовать AIDL для связи с этой службой, так как это еще один процесс, когда речь идет об Android, и на Android один процесс не может нормально получить доступ к памяти другого процесса.

Итак, чтобы поговорить друг с другом, им нужно разложить свои объекты на примитивы, которые операционная система сможет понять, и упорядочить объекты через эту границу для вас.

Я надеюсь,Вы скажете, что есть простой способ обмена данными, но я подозреваю, что вы скажете, что, поскольку они находятся в разных процессах, нет простого способа сделать это

Ну, этот способ процесса Androidмодель работает - я боюсь, что еще кто-то может сказать что-то другое

Я хотел бы избежать всех накладных расходов с Intents или .aidl или что-то еще ... Следует также сказать, что естьОсобая причина, по которой я хочу, чтобы сервис был в другом процессе.

То, что у вас есть особая причина для запуска сервиса в другом процессе - это делает аргумент в пользу AIDL еще более сильным, потому что согласно официальным даннымandroid docs,

Использование AIDL необходимо, если вы разрешаете клиентам из разных приложений доступ к вашему сервису дляr IPC и хотите управлять многопоточностью в вашем сервисе.Если вам не нужно выполнять параллельный IPC в разных приложениях, вы должны создать свой интерфейс с помощью Binder или, если вы хотите выполнять IPC, но не должны обрабатывать многопоточность, реализовать свой интерфейс с помощью Messenger.

Может быть, вы подумаете о внедрении Binder или Messenger - если это соответствует деталям реализации вашего конкретного сервиса.

...