java - Android: Intent 和组件之间交换数据

标签 java android android-intent ipc

我了解了进程间通信 (IPC) 以及创建从一个组件到另一个组件的发送数据。
我所知道的是IPC定义了不同组件之间的通信 channel 。
该 channel 将具有供组件发送数据的编程接口(interface)。创建接口(interface)的方式有AIDL、Binder、Messenger等。
创建接口(interface)后,通过该接口(interface)发送的数据必须是Parcel。 所以总结步骤如下:
1. 创建编程接口(interface)。
2. 将接口(interface)绑定(bind)到应用程序组件。
3. 向该组件发送数据的组件必须将数据转换为 Parcel。

但突然发现所谓的Intent可以将数据从一个组件发送到另一个组件而无需这种开销。
我需要解释 Intent 如何在不创建接口(interface)的情况下发送数据?
Intent内部有接口(interface)吗?
Intent与IPC、绑定(bind)服务、接口(interface)之间是什么关系?

最佳答案

哇,你这里有很多困惑。让我们看看我能否把事情弄清楚。

1)IPC 不会将数据从一个组件发送到另一个组件(可以,但这是一种低效的方法)。 IPC 将数据从一个进程发送到另一进程。 Android 应用程序通常是一个进程,但并非必须如此(开发人员有时会将服务放入另一个进程中)。这是一个重要区别的原因是进程不能共享内存,因此需要像 IPC 这样的特殊方法在它们之间发送任何数据。

2)组件之间发送的数据不一定是Parcel。这是一种方式,也是 Android 在发送启动参数时使用的方式。但这没有必要。

3) 只有当两者位于同一进程中时,才可以使用 Binder 与服务对话。这是一种完全避免使用IPC的方法。

4)AIDL 是 IPC 方法的包装器。 AIDL 使用 IPC,它只是试图使其看起来像对客户端的正常函数调用。

5) Intent 对象是 Android 中启动服务或 Activity 所需的所有数据的抽象。它将包含参数,这些参数可能位于也可能不位于 Parcel 中。它可能会或可能不会使用 IPC 来发送这些参数(如果目标 Activitiy 或 Service 在另一个 APK 中,它会。如果不是,则可能不会)。

我认为这里的问题是你并没有真正理解什么是进程,什么是 Android 组件,以及进程如何实际通信。我建议对此进行一些研究。

关于java - Android: Intent 和组件之间交换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572345/

相关文章:

java - 无法找到两个链表的两种迭代类型之间的区别

java - 关于最佳实践和正确编写测试的 Spring Boot 单元测试

android - 带有图像的 ListView 中的性能不佳

java - 带有 Intent 的空对象引用

java - 传递类名作为参数,稍后用作参数

java - 混淆后一类中的函数名称

java - 如何使用 View 计算面积、周长和半径

android - 完成 Activity/Intent

Android - Intent.putExtra() 失败

java - 如何只允许用户输入a-z的输入并使用if语句提示正确的输入