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

Passing data among components and apps

在 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", "string value" ) 和 Android 中的 fragment.setArguments(args)。

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

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

为什么要做这些工作?因为您 运行 的意图可能不在您的过程中。所以它不能直接共享它们,它需要制作副本。 extras只是一个内置的序列化方法,可以轻松传递复杂的数据。

为什么有时用Bundle,有时用Intent?好吧,每个 Intent 里面都有一个 Bundle。调用 intent.putIntExtra 将在该意图内的包上调用 Bundle.putInt。它只是一种方便的方法,因此您无需调用 intent.getExtras().putInt()。