使用Intents作为消息传递的一种形式

时间:2014-07-21 23:07:11

标签: android android-activity android-service

使用Intent作为我控制的两个应用程序之间传递消息的形式有什么缺点吗?

我有两个apks,它们将一直存在于设备上。并且,我希望使用显式意图来回传递消息,而不是创建和管理两个单独的服务。使用显式意图似乎比服务更容易管理。

3 个答案:

答案 0 :(得分:1)

应用程序之间的通信可以暴露某些丰富的内容,但如果您确实需要这样做,则只能自定义应用程序将具有的知识权限。然后,您可以使用BroadcasrReceiver使用自定义权限安全地交换邮件。

定义他们的权限:

<permission android:name="com.yourapp.PERMISSION"
    android:protectionLevel="signature"
        android:label="@string/permission_label"
        android:description="@string/permission_desc">
</permission>

通过设置

<receiver android:name=".MyReceiver"
    android:permission="com.yourapp.PERMISSION">
    <intent-filter>
        <action android:name="com.yourapp.ACTION" />
    </intent-filter>
</receiver>

除了这些权限,您还可以为他们设置购买ActivitiesServicesContentProvider

<强>被修改

AndroidInter-Process Communication), AIDL Android Interface Definition Language)中的现有流程之间的整合。

  

当不同的应用程序需要时,AIDL特别有用   他们之间进行交流以通过交换信息   定义良好的接口,支持多线程。与使用不同   带有AIDL的带有绑定服务的Messenger,您需要创建   一份文件。包含集成接口声明的AIDL,   这有助于客户端应用程序知道哪些操作   可用以及各自的论点和回报。

答案 1 :(得分:0)

你可以使用意图在两个应用程序之间传递数据。但是我看到曾经有一个缺点(不是太大) - 你需要注意那些意图不要暴露给其他人。一些恶意应用程序可以使用相同的意图发送糟糕的数据类似于拒绝服务攻击。

只是添加 - 如果交互是在后台,你也可以使用广播接收器。

此外,如果应用程序总是在一起,为什么不将它们打包为单个应用程序。如果您使用的是parcelables,如果有两个不同的parcelable不兼容版本,您的流程可能会中断。(如果您添加一个字段对于新版应用中的对象,其他应用仍未更新,应用可能会崩溃)。

答案 2 :(得分:0)

虽然这里的讨论似乎非常好,但在@André.C.S的建议中,我将加上我的2美分。

Intent是一种在进程之间传递消息的简单而有效的方法。 Android的一个主要功能是将另一个应用程序作为函数调用(Activity.startActivityForResult),具体取决于它。

正如大家已经指出的那样,无论是BroadcastReceiversServices还是Activities解雇,都会遇到安全问题。如果您决定使用它们,则需要保护它们。 Andre的描述如何使用权限来做到这一点。您必须将捕获意图的方法视为Web服务,并相应地验证参数等。

最后,Intents虽然简单,但实际上并不适合高带宽IPC。如果您将以毫秒测量的速率与其他应用交换消息,您将需要查看AIDL和绑定服务。通过我的测量,它们的速度提高了1到2个数量级。

顺便提一下,您可以考虑在相同的进程中运行这两个应用程序。有明确的应用程序属性允许这样做。如果你这样做,使用显式意图将很容易,你的应用程序会更安全。

编辑指出极其尴尬的错误

所以,按照我自己的建议,我试了一下。令我恐惧的是,正如几个人试图指出的那样,明确的意图可以跨进程使用。

我正在吃一大堆乌鸦,还有一些不起眼的馅饼。

我声明,显式意图包含ComponentName对象,而不是对类对象的显式引用。 ComponentName包含包名称和类名。前者通常来自当前上下文,因此是当前过程的本地。但是,可以构造一个包含名称为任意字符串的intent。

我有所纠正。

相关问题