Делегировать преобразование текста в «плагины» приложений для 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