Наше приложение показывает пользователю флеш-карту HTML.
Мы добавили несколько слоев «фильтров», чтобы удовлетворить различные группы пользователей:
{FEN:rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2}
в таблицу HTML, представляющую шахматную доску с фигурами в правильном положении 字
в <ruby>字<rt>zì</rt></ruby>
Оригинальный HTML → Шахматная трансформация → Китайская трансформация → … → Окончательный HTML для отображения
Количество фильтров растет, что приводит к проблемам:
Итак, мы хотели бы сделать эти отдельно устанавливаемые приложения.
Например, шахматы + китайский энтузиаст установили бы 3 приложения:
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); }
Вам нужен динамически установленный плагин, который не является частью вашего приложения. Я думаю, у вас есть несколько вариантов для этого.
Отправляйте интерпретатор языка сценариев с вашим приложением. (Например, ruby - http://ruboto.org/ ). Создайте интерфейс для выполнения этих сценариев. Создайте центральную базу данных таких скриптов или загрузите их из внешнего хранилища. Теперь вы можете выполнить эти скрипты и получить требуемый результат.
Используйте удаленную службу в приложениях плагина. Предоставьте AIDL третьим сторонам для разработки приложений с удаленной службой с этим AIDL. Такие службы также должны соответствовать установленному вами фильтру намерений. Теперь вы можете использовать packagemanager для поиска таких сервисов, выбрать один и подключиться к нему. Теперь вы можете вызвать все методы AIDL. Это будет взаимодействие между процессами с использованием связующего, для вашего приложения это будет синхронный вызов. (Подробнее см. Этот вопрос SO – доступ к удаленной службе в разных приложениях )
Подход к этому подходу заключается в том, что все эти службы должны запускаться, когда ваше приложение запущено, поэтому вам придется обрабатывать запуск / остановку этих служб. Это также повлияет на потребление энергии, если службы работают в фоновом режиме.
Сторонние установленные приложения, у которых есть широковещательный приемник с фильтром намерения для пользовательского намерения, определенного вами. Кроме того, ваше приложение должно иметь широковещательный приемник с особым намерением, который плагины могут вызывать с результатом. Теперь, скажем, вы хотите вызвать сторонний плагин для какого-либо преобразования, вы должны сделать это:
Используйте packagemanager, чтобы найти все сторонние приложения, соответствующие вашим пользовательским намерениям. Отправить трансляцию с extradata о трансформации. Обрабатывайте преобразование в широковещательном приемнике приложения плагина. После трансформации отправьте трансляцию с результатом в исходное приложение.
Этот параметр полностью асинхронен, и для выполнения без каких-либо гарантий может потребоваться любое количество времени.