我们的应用向用户显示HTML flashcard 我们添加了几层“过滤器”以满足不同的用户群:
{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
的应用列表,并依次调用它们?
速度是一项主要要求。我已经读过Intents are 10+ times slower than direct calls ... Parcelable会在这里提供帮助吗?
如果不可能,还有其他解决方案吗?
答案 0 :(得分:3)
要了解具有 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 :(得分:2)
您需要一个动态安装的插件,该插件不属于您的应用程序。我想你有几个选择。
随您的应用发送脚本语言口译员。 (例如,红宝石 - http://ruboto.org/)。创建用于执行这些脚本的界面。创建此类脚本的中央数据库,或从外部存储加载它们。现在,您可以执行这些脚本并获得所需的结果。
在插件应用中使用远程服务。为第三方提供AIDL,以使用该AIDL开发具有远程服务的应用程序。此类服务还应符合您定义的意图过滤器。现在您可以使用packagemanager查找此类服务,选择一个并连接到它。现在您可以调用所有AIDL方法。这将是使用binder的进程间通信,对于您的应用程序,这将是同步调用。 (详情请参阅此SO问题 - Access remote service in different application)
这种方法的缺点是,当您的应用程序运行时,所有这些服务都需要运行,因此您必须处理这些服务的启动/停止。如果服务在后台运行,它也会影响功耗。
第三方安装了具有广播接收器的应用,该广播接收器具有针对您定义的自定义意图的意图过滤器。此外,您的应用程序需要一个具有自定义意图的广播接收器,插件可以使用该结果调用。现在,假设您想要调用第三方插件进行某些转换,您必须这样做:
使用packagemanager查找符合的所有第三方应用 你的自定义意图。发送带有extradata的广播 转型。处理广播接收机中的转换 插件应用程序。转换完成后,发送广播 结果是原来的应用程序。
此选项完全是异步的,可能需要花费任何时间来执行而不保证。