将文本转换委派给"插件" Android应用,事先不知道

时间:2014-04-11 01:41:07

标签: android android-intent plugins intentfilter

上下文

我们的应用向用户显示HTML flashcard 我们添加了几层“过滤器”以满足不同的用户群:

  • 为了满足国际象棋爱好者,我们将任何{FEN:rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2}块转换为代表棋盘的HTML表,其中棋子位于正确的位置
  • 为了满足中文语言学习者,我们将转换为<ruby>字<rt>zì</rt></ruby>
  • ...

原始HTML→国际象棋转换→中文转换→...→最终HTML显示

问题

过滤器数量不断增加,导致出现问题:

  • 较慢的演绎
  • 更重要的下载
  • 维护更大的源代码
  • 更多错误/崩溃
  • 维护负担

问题

因此,我们希望制作这些可单独安装的应用程序 例如,国际象棋+中国爱好者将安装3个应用程序:

  • 该app
  • TheApp Chess插件
  • TheApp中文插件

TheApp会自动发现安装了哪些插件,并依次调用它们(顺序无关紧要)。

我正在考虑使用意图THEAPPTRANSFORM,但我如何才能收到<intent-filter> THEAPPTRANSFORM的应用列表,并依次调用它们?

速度是一项主要要求。我已经读过Intents are 10+ times slower than direct calls ... Parcelable会在这里提供帮助吗?

如果不可能,还有其他解决方案吗?

2 个答案:

答案 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)

您需要一个动态安装的插件,该插件不属于您的应用程序。我想你有几个选择。

解决方案1:脚本

随您的应用发送脚本语言口译员。 (例如,红宝石 - http://ruboto.org/)。创建用于执行这些脚本的界面。创建此类脚本的中央数据库,或从外部存储加载它们。现在,您可以执行这些脚本并获得所需的结果。

解决方案2:AIDL

在插件应用中使用远程服务。为第三方提供AIDL,以使用该AIDL开发具有远程服务的应用程序。此类服务还应符合您定义的意图过滤器。现在您可以使用packagemanager查找此类服务,选择一个并连接到它。现在您可以调用所有AIDL方法。这将是使用binder的进程间通信,对于您的应用程序,这将是同步调用。 (详情请参阅此SO问题 - Access remote service in different application

这种方法的缺点是,当您的应用程序运行时,所有这些服务都需要运行,因此您必须处理这些服务的启动/停止。如果服务在后台运行,它也会影响功耗。

解决方案3:广播/接收器

第三方安装了具有广播接收器的应用,该广播接收器具有针对您定义的自定义意图的意图过滤器。此外,您的应用程序需要一个具有自定义意图的广播接收器,插件可以使用该结果调用。现在,假设您想要调用第三方插件进行某些转换,您必须这样做:

  

使用packagemanager查找符合的所有第三方应用   你的自定义意图。发送带有extradata的广播   转型。处理广播接收机中的转换   插件应用程序。转换完成后,发送广播   结果是原来的应用程序。

此选项完全是异步的,可能需要花费任何时间来执行而不保证。