在android中分配对象以从一个活动转移到另一个活动

aka*_*h89 5 android bundle parcelable

最近一位采访者问我一个非常棘手的问题.这个问题有几个部分.

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

我给的答案 -

Parcelable为开发人员提供了限制对象创建的能力,从而使其更快地使用.

我对此感到困惑,所以决定使用serializable和parcelable之间的区别:p(聪明的huuuhhh!), http://www.developerphil.com/parcelable-vs-serializable/使用了这个引用.

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

我给的答案 -

因为String/int是原始数据类型,如果我们直接使用Wrapper类,可能我们必须使用parcelable(我不确定那部分)

谷歌搜索后我没有得到任何有用的链接,我或者面试官对答案也不太满意.如果你们能提供帮助,那就太好了!

u3l*_*u3l 6

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

Parcelling/serializing对象并不像你猜到的那样速度.

当您在活动之间,特别是在不同的应用程序之间发送数据时(请记住,Intent对象不仅用于您自己的活动之间的通信,也适用于您和其他应用程序之间的通信),您不能指望发送者并且接收器可以访问相同的存储器地址空间.

Android的文档指出应用程序在自己的独立内存空间中运行.以下是来自文档的引用:

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

因此,当您想要将对象发送myObject到某个接收时Activity,您无法发送其引用/指针,因为接收器不一定能够访问指针指定的位置.相反,你得送一些代表性myObject接收器可以访问和使用-这就是为什么你需要马歇尔数据成一种形式,可以解组,而这样做最简单的方法是简单地具有类对象实现Serializable,它可以让Java的尽最大努力将对象转换为字节数组,可以通过接收器很容易地发送到与解组.但由于Serializable使用反射,这很慢.

您可以使用更快速地编组数据的其他方法 - 例如,JSON使用类似的库将对象转换为其表示Gson,并将其发送到任何JSON文档,因为任何文档都可以表示为a String并且可以轻松地转换回Java Object.另一种方式,这可能是在几乎所有情况下更快地使用Parcelable它可以让你指定接口究竟要如何马歇尔的数据,并确切地应该如何解组.它基本上可以让您更好地控制对象的传输.

使用tl:dr:Parcelling/Serializing等因为你不能发送内存地址,所以你必须发送对象的实际数据,它必须以某种形式表示.

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

如何Bundle内部工作原理是,它把一切都变成Map根据需要和包裹/ unparcels的数据(即当GET/PUT被调用).为了将对象放入a中Bundle,对象的类需要实现,Serializable或者Parcelable因为它需要告诉Bundle它应该如何在内部编组/解组.

但是原始类型和字符串很简单并且经常使用,开发人员不需要指定它是如何发生的,并Bundle为它提供方便的方法.我无法在最低级别的工作中给出一个可靠的答案,因为很多Parcel代码都是本机实现的,我无法在线找到它,但它们必须直接转换为字节表示.