【问题标题】:Passing data among components and apps在组件和应用程序之间传递数据
【发布时间】:2017-11-05 18:17:05
【问题描述】:

在 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") 和 fragment.setArguments(args)安卓。

【问题讨论】:

  • 您需要提出更具体的问题。你的帖子漫无边际,从共享 CPU 和操作系统级别的概念(例如在应用程序之间分配内存)到应用程序级别的概念(例如垃圾收集),再到有关特定实现细节的框架问题,再到提到不属于框架的函数,并且将是特定应用程序的实现细节。专注于一件事,并提出明确的问题。
  • @GabeSechan 感谢您的回复。编辑了我的问题。
  • 好的,这是一个可回答的级别。给我一分钟。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答!这是真的,你写的我在android源代码中找到了。因此,所有这些数据都存储在实现 Map 接口的 ArrayMap 中。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多