【问题标题】:Which kind of inter-application communication should I choose?我应该选择哪种类型的应用程序间通信?
【发布时间】:2013-09-19 13:07:21
【问题描述】:

我需要 Android 中的推送逻辑消息广播功能,将数据消息推送到订阅内容的其他应用程序。订阅应用程序应注册过滤器设置和权限,以便它们只接收他们感兴趣的数据。这样可以确保不会连续进行不必要的传输,因为这会浪费资源。

Android 中是否有任何现成的机制来实现这一点?

我查看了意图广播,但似乎我将数据打包为一个 parcelable 我没有内置过滤器功能。我总是必须将所有数据发送到一个 parcelable 中,然后解包并提取我感兴趣的那一小部分(?)

然后我查看了 ContentProviders,但似乎它们不会将消息推送给收件人,而是使用类似 sql 的查询字符串来查询要获取的内容。 ContentProvider 能否使用查询作为过滤器将消息推送到注册的收件人?

也许要回答一个复杂的问题,但我试一试;我应该使用哪种机制,还是必须自己编写?

【问题讨论】:

    标签: android android-contentprovider communication broadcast


    【解决方案1】:

    Android 中是否有任何现成的机制来实现这一点?

    这取决于您希望将问题的哪一部分视为“即用型”。通过广播Intents 处理将数据推送到另一个应用程序。

    我查看了意图广播,但似乎我将数据打包为一个 parcelable 我没有内置过滤器功能。我总是必须将所有数据发送到一个 parcelable 中,然后解包并提取我从那里感兴趣的小部分(?)

    您的应用会进行过滤,然后发送比赛的广播。这是基于代理的“发布/订阅”推送模型采用的典型方法:代理进行过滤,仅通过通信通道向订阅者发送相关消息。例如,GCM 不会将 every 消息发送到 every 设备 每个设备并期望设备进行自己的过滤 - GCM 服务器进行过滤,然后将特定消息发送到特定设备。

    在某些情况下,您可以利用IntentFilter 功能为您进行过滤。例如,假设一条消息确实代表了一个文件。文件具有 MIME 类型。您可以在正在广播的Intent 中包含文件的 MIME 类型,并且接收者可以通过他们的过滤器指定他们感兴趣的 MIME 类型。接收者只会从相关广播中获取消息。

    但是,对于更多任意类型的订阅(例如,“向我发送在某些 JSON 编码对象中具有特定值的所有消息”),您必须自己实现过滤。

    ContentProvider 能否使用查询作为过滤器将消息推送到注册的收件人?

    不,抱歉。

    【讨论】:

    • 我可以绑定到服务以打开从接收器到发送器的数据流。向发送器发送一些过滤器参数,然后让它写入流?
    • @user2254314:这是另一种可能性,但它要求所有应用程序的进程一直在内存中,这在大多数情况下是不切实际的。如果这些应用程序联系紧密,恕我直言,它们不应该是单独的应用程序。
    • @user2254314:“我怎样才能让另一个应用程序可以访问流”——使用ContentProvider。 “它应该一直保持打开状态,直到订阅应用程序决定取消订阅”——用户可以控制他们的设备,并且可以随时从内存中删除任何后台进程。
    • @user2254314:我没试过。我个人使用ParcelFileDescriptorcreatePipe()
    • @user2254314:我猜是使用Parcelmarshall()unmarshall() 方法。我从来没有这样做过。如果您在这方面遇到更多问题,我建议您打开一个单独的 SO 问题,假设搜索没有任何用处。
    【解决方案2】:

    1 您可以使用意图广播密钥以在应用程序中进行过滤,然后感兴趣的应用程序可以使用内容提供程序来获取完整数据。 2 对不同的数据集使用不同的意图?

    【讨论】:

    • 1.似乎不合适,因为我想要立即获取数据并且不想获取数据,而是将其推送。 2. 似乎可行,但似乎是一个丑陋的解决方案。如果我有很多不同的数据集,那么我需要有大量不同的意图(?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多