当前位置: 首页 > 知识库问答 >
问题:

在android中打包对象以从一个活动转移到另一个活动

司马英才
2023-03-14

最近一个面试官问了我一个很棘手的问题。这个问题有几个部分。

  1. 为什么(问题是为什么,而不是如何)需要在从一个活动发送到另一个活动时打包对象,而不是直接发送

我给的答案-

Parcelable为开发人员提供了限制对象创建的能力,这在某种程度上使其使用速度更快。

我没有得到任何有用的链接后,谷歌,而且我或面试官不太满意的答案。如果你们能帮忙,那就太好了!

共有1个答案

茅曾琪
2023-03-14

为什么(问题是为什么而不是如何)需要在从一个活动发送到另一个活动的同时包裹对象,而不是直接发送

对对象进行打包/序列化并不像您所猜测的那样是为了提高速度。

当您在活动之间,特别是在不同的应用程序之间发送数据时(请记住,intent对象不仅用于您自己的活动之间的通信,还用于您的应用程序和其他应用程序之间的通信),您不能期望发送方和接收方能够访问相同的内存地址空间。

Android的文档说明应用程序运行在它们自己的离散内存空间中。这里引用了文档中的一段大意为:

每个进程都有自己的虚拟机(VM),因此应用程序的代码与其他应用程序隔离运行。

因此,当您希望将对象myobject发送到某个接收activity时,您不能发送其引用/指针,因为接收方不一定有权访问指针指定的位置。相反,您必须发送接收方可以访问和使用的MyObject的一些表示形式--这就是为什么您需要将数据整理成可以解封的形式,而这样做的最简单的方法是让对象的类实现Serializable,这让Java尽其所能将对象转换成一个字节数组,可以轻松地发送给接收方并由接收方解封。但由于serializable使用反射,因此速度很慢。

您可以使用其他更快的方法来整理数据--例如,一种方法是使用GSON之类的库将对象转换为其JSON表示形式,然后将其发送出去,因为任何JSON文档都可以表示为字符串并很容易地转换回Java对象。另一种可能在几乎所有情况下都更快的方法是使用parcelable接口,该接口允许您指定要如何对数据进行封送以及应该如何对数据进行解封。它基本上让你对物体的传输有更多的控制。

使用TL:DR:Parcelling/Serializing等是因为您不能跨区域发送内存地址,所以必须发送对象的实际数据,并且必须以某种形式表示。

在使用Bundle时,当我们使用String,int时,我们不需要打包数据,所以您认为String/int默认是内部打包的吗?

bundle在内部的工作方式是将所有内容放入map中,并根据需要(即调用GET/PUT时)对数据进行打包/解包。为了将对象放入bundle中,对象的类需要实现serializableparcelable,因为它需要告诉bundle如何在内部封送/取消封送。

但是基元类型和字符串非常简单,使用频率也很高,开发人员不需要指定如何实现这一点,bundle为此提供了方便的方法。我不能给您一个关于它们如何工作的最低级别的可靠答案,因为很多parcel代码是本机实现的,我在网上找不到,但是它们必须很容易转换成以字节为单位的表示形式。

 类似资料:
  • 问题内容: 听起来很简单,但我无法使其正常工作。我有两个活动。第一个是表单,第二个是根据在第一个活动中输入的值显示JSON文件中的数据。 因此,我正在尝试制作一个简单的版本。我有一个EditText和一个按钮,因此当他们按下按钮时,EditText中的内容将出现在下一个活动的TextView中。 到目前为止,这是我的代码: 主要活动 主要XML 第二次活动 第二个XML 通过这种方式,我为Edit

  • 我正在写一个Android应用程序,有Java和静态编程语言活动。我希望从静态编程语言移动到Java,已经完成了,现在我希望回到静态编程语言活动,我找不到具体的代码。 我的应用程序名称是starter,Kotlin活动是MainActivity。kt和java类是face_detect。JAVA我已经试过:` ` 我希望单击face_detect上的按钮。java,这将把我带到MainActivi

  • 我正在尝试建立一个简单的 ActiveMQ 代理网络。我有2台机器,比如A和B。 在A的< code>activemq.xml文件中,我放置了networkConnector,它具有指向机器b的URI。在A的日志中,显示它连接到了b 我有一个向A发送消息的应用程序。在ActiveMQ的网络控制台的网络选项卡中,我可以看到我的消息正在排队和出队(我认为这意味着消息被转发到机器B)。 我的问题是消息在

  • 在SO上也有类似的问题,但没有一个对我有效。 我想在Activity1中获取被点击的图像并在Activity2中显示它。 我获取被点击图像的图像id如下所示: 并通过意图传递给另一个活动。 任何帮助都很感激。

  • 我想把意图转移到Xamarin.Android中的另一个活动。基本上,我需要Intent.data和Intent.clipdata到另一个活动,所以我使用下面的代码来传输Intent,但我不知道检索它的正确方法。 下面是Main Activity中的代码 在第二活动中 如何在第二个活动中检索意图?

  • 我试图将图像从一个活动发送到另一个活动,但我不知道如何设置ImageView。