在组件和应用程序之间传递数据

时间:2017-11-05 18:17:06

标签: android android-intent memory-management bundle parcelable

如何在Android中的组件和应用程序之间传递数据的方式不同。例如,以下是其中一些:

Intent intent = new Intent(this, DestinationActivity.class);
intent.putExtra("key", "value");

or

Bundle args = new Bundle();
args.putInt("someInt", someInt);
args.putParcelable("key", ParcelableObject);
Intent intent = new Intent();
intent.setAction("someAction");
intent.putExtra("key", arg);

or

fragment.setArguments(args);

正如我所知,在java中,原始值存储在堆栈中,对象放在堆中。所以,我想知道在调用这些方法时会发生什么:bundle.putInt(int)和bundle.putParcelable(Object),intent.putExtra(" key"," Android中的字符串值")和fragment.setArguments(args)。

1 个答案:

答案 0 :(得分:2)

实际上并没有那么多。 Bundle里面是一张地图。 putInt将整数原语转换为Integer对象,并将Integer放入映射中。 putString将String对象放在那里。 putParcelable将把一个扩展Parcelable的对象放入地图中。这就是当时发生的一切。

当调用startActivity时,它将遍历该映射,并基本上构建数据流。格式不是JSON,但它具有类似的用途 - 它是一种易于理解的格式,可以在以后解析为值。当它遍历该映射时,它知道如何向该文件添加原语(int,double等)。它也知道如何做弦乐。对于Parcelable对象,对象中有一个函数将对象添加到流中,另一个函数将其从流中解析出来。然后它接受该流并要求OS将该流传递给实现intent的进程。该应用程序中的Android框架会将流解析回地图(创建新对象),然后将其传递给onCreate。

为什么这一切都有效?因为您运行的意图可能不在您的过程中。因此它不能直接共享它们,它需要复制。附加功能只是一种内置的序列化方法,可以轻松传递复杂的数据。

为什么我们有时会使用Bundle,有时候会使用Intent?好吧,每个Intent里面都有一个Bundle。调用intent.putIntExtra将在该intent内的bundle上调用Bundle.putInt。它只是一种方便的方法,所以你不需要调用intent.getExtras()。putInt()。