Ваше потребительское приложение должно знать:
Возможные способы узнать, какие источники установлены:
- Итерация по списку известных возможных идентификаторов исходного приложения и использование
PackageManager
для просмотра установленных
- Использование некоторого соглашения об именовании идентификаторов приложений (если вы будете разработчиком всех исходных приложений) и использование
PackageManager
, чтобы увидеть, какие установленные приложения придерживаются этого соглашения
- Использование
PackageManager
и queryBroadcastReceivers()
, чтобы увидеть, какие приложения реализуют приемник для некоторой известной строки действия
- Использование
PackageManager
для перебора всех установленных приложений и просмотра, у которых есть определенная <meta-data>
запись
Вы можете использовать SharedPreference
и MultiSelectListPreference
, или какой-либо подобный пользовательский интерфейс, чтобы позволить пользователю снимать флажки с определенных источников, которые он не хочет использовать в потребительском приложении.
Учитывая, что вы планируете источники, отправляющие широковещательные сообщения потребителям, вам также понадобится тот же базовый поток в исходных приложениях, чтобы увидеть:
- Какие потребители установлены
- С каким подмножеством этих потребителей пользователь хочет, чтобы исходное приложение работало с
Учитывая, что источники знают приемлемых потребителей, и наоборот, у вас есть различные варианты IPC.
Такое ощущение, что большая часть сообщений является источником -> потребителем. В этом случае разумно использовать источники, использующие трансляции. Имейте в виду, что это должны быть прямые трансляции:
- Создайте
Intent
с желаемой строкой действия
- Перебирать идентификаторы приложений соответствующих потребителей
- Используйте
setPackage()
на копии Intent
, чтобы связать ее с конкретным потребителем
- Отправить "трансляцию" этой копии
Если я прав, что большая часть сообщений является источником -> потребителем, то целесообразно использовать широковещательную передачу от потребителя -> источника для «пробуждения» источников и получения кэшированных данных, если это упростит реализацию источников , Может случиться так, что обычная трансляция обновлений очень похожа на трансляцию «отправить кэшированные события».
Если между этими двумя широковещательными сообщениями будут существенные различия, такие, что не много кода будет совместно использоваться ни источником, ни потребителем, вы можете устранить асинхронный характер этого подхода и использовать ContentProvider
, где В источнике есть поставщик, к которому может обратиться потребитель.
ИМХО, ваша проблема № 1 во всем этом - это конфиденциальность и безопасность. N-партийное общение, подобное этому, становится сложным, чтобы убедиться, что это не случайное N + 1-стороннее общение, где +1 - это часть шпионского ПО.