Сценарий: У меня есть Controller
(нормальный класс Java), который должен иметь возможность пилотировать несколько Slave
.Почему AIDL/Messenger привязаны к службе?
Природная Slave
«s может отличаться, так что это может быть:
Service
, давайте называть егоServiceSlave
: жизненный цикл этого объекта, как правило, отличается от компонентов приложения (например, это делает не зависит от текущей активности)- простого класса Java, скажем,
ObjectSlave
: жизненный цикл этого объекта несколько связанный с областью, в которой он был создан (скажем, текущая активность)
Что общего у этих двух типов: Slave
s, то есть они могут находиться в разных процессах.
Из-за этого последнего «требование», я сразу обратил внимание на AIDL
/Messenger
как форма связи между Controller
и Slave
, так как она обеспечивает IPC.
Тем не менее, кажется, что AIDL
(и, в свою очередь Messenger
, так как она должна быть основана на AIDL а) только был определен, если вы хотите работать с Service
. То есть, у меня нет возможности реализовать интерфейс на основе AIDL
без объекта IBinder
, который обычно предоставляется в методе onServiceConnected
.
ПЕРВЫЙ ВОПРОС: может AIDL
действительно можно использовать только при работе с Service
? Если да, то почему?
Теперь рассмотрим мой сценарий. Я бы хотел, чтобы любой другой хороший разработчик написал один элегантный интерфейс, который позволяет Controller
пилотировать каждый Slave
, независимо от их характера. Единственное решение, которое дошло до меня до сих пор, связано с использованием Intent
s и BroadcastReceiver
s, все они удобно завернуты в выделенные классы Java.
ВТОРОЙ ВОПРОС: Это единственный жизнеспособный способ? Я что-то наблюдаю?
EDIT
Я предполагаю, что я должен дали более подробную информацию о том, что на самом деле делает Controller
элемент. Это компонент, который слабо связан с несколькими виджетами пользовательского интерфейса, которые подписываются на него. Он был разработан (охотно), так что ему не нужна ссылка на Context
. Так что это не необходимо или использовать UI виджеты напрямую, но в свою очередь эти виджеты зависят от Controller
.
ОК, с отредактированной информацией, я запутался о том, что реальной цели Парадигма Controller/Slave. Если он полностью является внутренним для «Активность» в вашем приложении (без необходимости использования «Контекста»), вы вообще не хотите «Сервис», AIDL или «Messenger». Все они используются, когда вы пересекаете границы процесса или ('Service'), что-то работает, не ориентированное на пользовательский интерфейс.Если вы просто используете это как внутреннюю систему типа публикации-подписки, тогда вам нужно будет определить классы и интерфейсы. При этом вы можете захотеть посмотреть EventBus или Otto как возможные сторонние помощники. –
ОК, поэтому у меня явно есть проблемы с объяснением этого. Мой главный вопрос касается связи между «Контроллером» и «Ведомым», где последнее может быть или не быть «Сервисом». Коммуникация должна быть inter-process (поскольку «Controller» и «Slave» могут работать на разных процессах), но она также может быть внутри одного и того же процесса. – Sebastiano
Но присутствует ли «Контроллер» только при запуске «Активность»? –