Делегировать преобразование текста в «плагины» приложений для Android, не известных заранее

контекст

Наше приложение показывает пользователю флеш-карту HTML.
Мы добавили несколько слоев «фильтров», чтобы удовлетворить различные группы пользователей:

  • Чтобы удовлетворить энтузиастов шахмат , мы конвертируем любой {FEN:rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2} в таблицу HTML, представляющую шахматную доску с фигурами в правильном положении
  • Чтобы удовлетворить учеников китайского языка, мы конвертируем в <ruby>字<rt>zì</rt></ruby>

Оригинальный HTML → Шахматная трансформация → Китайская трансформация → … → Окончательный HTML для отображения

проблема

Количество фильтров растет, что приводит к проблемам:

  • Более медленное исполнение
  • Более тяжелая загрузка
  • Более высокий исходный код для поддержки
  • Больше ошибок / сбоев
  • Бремя обслуживания

Вопрос

Итак, мы хотели бы сделать эти отдельно устанавливаемые приложения.
Например, шахматы + китайский энтузиаст установили бы 3 приложения:

  • Приложение
  • Плагин TheApp Chess
  • TheApp Chinese plugin

TheApp автоматически обнаружит, какие плагины установлены, и вызовите их по очереди (порядок не имеет значения).

Я думал использовать намерение THEAPPTRANSFORM , но как я могу получить список приложений, у которых есть <intent-filter> для THEAPPTRANSFORM , и вызвать их по очереди?

Скорость является основным требованием. Я прочитал, что намерения в 10+ раз медленнее, чем прямые звонки … Была бы полезной помощь здесь?

Если это невозможно, есть ли другое решение?

Чтобы знать приложения, в которых используется приемник широковещательной передачи с THEAPPTRANSFORM в качестве фильтра, вы можете использовать код ниже

 PackageManager pm = getPackageManager(); Intent intent = new Intent("THEAPPTRANSFORM"); List<ResolveInfo> info = pm.queryBroadcastReceivers(intent, 0); for (ResolveInfo resolveInfo : info) { Log.e("apps", "packages = " + resolveInfo.activityInfo.packageName); } 

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

Решение 1. Сценарии

Отправляйте интерпретатор языка сценариев с вашим приложением. (Например, ruby ​​- http://ruboto.org/ ). Создайте интерфейс для выполнения этих сценариев. Создайте центральную базу данных таких скриптов или загрузите их из внешнего хранилища. Теперь вы можете выполнить эти скрипты и получить требуемый результат.

Решение 2: AIDL

Используйте удаленную службу в приложениях плагина. Предоставьте AIDL третьим сторонам для разработки приложений с удаленной службой с этим AIDL. Такие службы также должны соответствовать установленному вами фильтру намерений. Теперь вы можете использовать packagemanager для поиска таких сервисов, выбрать один и подключиться к нему. Теперь вы можете вызвать все методы AIDL. Это будет взаимодействие между процессами с использованием связующего, для вашего приложения это будет синхронный вызов. (Подробнее см. Этот вопрос SO – доступ к удаленной службе в разных приложениях )

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

Решение 3: широковещательная / приемная

Сторонние установленные приложения, у которых есть широковещательный приемник с фильтром намерения для пользовательского намерения, определенного вами. Кроме того, ваше приложение должно иметь широковещательный приемник с особым намерением, который плагины могут вызывать с результатом. Теперь, скажем, вы хотите вызвать сторонний плагин для какого-либо преобразования, вы должны сделать это:

Используйте packagemanager, чтобы найти все сторонние приложения, соответствующие вашим пользовательским намерениям. Отправить трансляцию с extradata о трансформации. Обрабатывайте преобразование в широковещательном приемнике приложения плагина. После трансформации отправьте трансляцию с результатом в исходное приложение.

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

Intereting Posts
Оптимальная архитектура телефонных разговоров Повторно использовать соединение asmack или воссоздать его в случае отключения (в том числе сломанных TCP-соединений) безопасным способом? Android: MapFragment не перемещается в анимацию Как искать видео с API данных youtube в Android Ошибка Android Out of Memory с ленивой загрузкой изображений Как сохранить соотношение сторон VectorDrawable? База данных Firebase возвращает значение null каждый раз при чтении Android queryIntentActivities всегда возвращает пустой список Как протестировать корпоративное приложение Android на разных устройствах Есть ли эквивалент iOS 'identifierForVendor для android? Активность андроида просочилась в окно com.android.internal.policy.impl.phonewindow $ decorview Проблема Хотите создать плагин в Cocos2d для моего SDK Java.lang.NoClassDefFoundError в студии android Экран панели действий Шерлок – вкладки не изменятся в ландшафте при прокрутке Я хочу добавить popover / overlay / hotspot на уличное представление google map в android