【问题标题】:Call Activity with Custom Arguments使用自定义参数调用活动
【发布时间】:2013-04-29 19:47:24
【问题描述】:

我想询问有关使用参数调用 Activity 的问题。我看过很多关于它的例子。但我想问一个解释,为什么用自定义参数创建(调用)一个活动以某种方式“不容易”“不简单”

我看过很多帖子,比如this 等。人们传递字符串但不传递自定义对象。是的,他们通过实现可序列化和可解析的方法来传递自定义对象,但这似乎效率不高(我可能错了,因为没有看到它)。对于 final 声明的类来说,要做的工作就更多了。

当我们用putExtras(String name, String value)传递String时,为什么没有定义像putExtras(String name, Object object)这样的函数?这样传递任何自定义对象不是更容易吗?

以及关于过程的复杂性,在here的帖子中给出了解释

因为应用程序处于不同的进程中,并且具有单独的内存 地址空间,您不能只将指针(引用)发送到内存块 在您的进程中,并期望它在另一个进程中可用。

但是,我仍然找不到让我满意或帮助我意识到我没有看到的原因。好的,假设应用程序处于不同的进程中,并且它们的内存空间不同。那么我们是否将要传递的数据复制到另一个活动的内存空间中?或者至少,不应该属于同一个应用程序的活动(我相信应用程序中的活动有一些共同的地址到它的应用程序)具有公共内存空间,以便它们可以轻松地共享或传递数据?

我只是想澄清一下。我知道 Android 不应该与 Windows 开发相比较,但感觉如果事情更简单的话会更好。我知道我在这方面遗漏了一些东西,否则每个人都知道更简单会更好。但是是什么阻碍了事情的顺利通过呢?

谢谢。

【问题讨论】:

  • 我同意这一点,并且只能得出结论,Android 的构建方式相当愚蠢。强制简单对象可序列化只是为了将它从一个 Activity 传递到另一个 Activity 只是......疯狂。当然,CommonsWare 解释了原因,但如果我作为 Android 操作系统的设计师工作,并且我想出了这样的事情,我会解雇自己并禁止自己再次编码 ;-)

标签: android android-activity arguments


【解决方案1】:

为什么没有定义像 putExtras(String name, Object object) 这样的函数?这样传递任何自定义对象不是更容易吗?

因为startActivity() 总是跨越进程边界,因此传递的任何内容都需要转换为字节数组以进行传输。

那么我们是否将要传递的数据复制到另一个活动的内存空间中?

我们正在进程之间复制数据。

或者至少,不应该属于同一个应用程序的活动(我相信应用程序中的活动有一些共同的地址到它的应用程序)具有公共内存空间,以便他们可以轻松地共享或传递数据?

除了startActivity()的主要工作不是由您的应用程序进程完成,而是由一个核心操作系统进程完成。

我知道不应将 Android 与 Windows 开发相比较,但感觉如果事情更简单一些会更好。

一个更好的类比是 Web 开发,您不在客户端和服务器之间传递对象,而是在字符串或字节数组之间进行数据编组。

【讨论】:

  • 传递给活动的数据真的被复制而不被引用吗?我认为这就是 Android 不允许传递对象的原因。所以我猜没有办法在活动之间传递图像.. 仍然试图理解“为什么”的原因。
  • @OmerHalit:“是否真的将数据传递给正在复制而不是引用的活动?” - 是的。 “所以我猜不可能在活动之间传递图像” - 不是通过Intent 额外的,除非它们真的很小。 “仍在试图理解“为什么”的原因”——这就是他们选择编写操作系统的方式。
  • “这就是他们选择编写操作系统的方式”——我需要找出他们选择这种方式的原因。如果他们选择这样做,一定有好处,否则他们就错了。只是我需要了解架构,以便知道自己在做什么,但这需要我很长时间。在 Web 开发中,我理解是因为用户和源不在同一个地方,但在 Android 中却是。在 iOS 开发中是一样的还是更简单?
【解决方案2】:

正如您自己发现的那样,您通过 Bundle 在活动之间传递数据,如下所示:

Intent intent = new Intent(context, MyActivity.class);
intent.putExtra(key, "some string");
intent.putExtra(key, true);
intent.putExtra(key, 1.5f);

问题是 Intent 和 Bundle 是一种非常通用的方式,不仅可以在您自己的 Activity 之间传递数据,还可以将数据传递给其他应用程序,例如通过启动消息传递客户端并提供预定义的主题和正文。这是非常强大的,但它也是一个约束。如果你想通过 MyFooClass 怎么办?好吧,您不能这样做,因为 Intent 是一种执行操作的抽象方式,不仅在您自己的应用程序中。有人可能会争辩说,Google 应该对您自己的活动之间的意图进行例外处理,但我真的不认为这是一个非常大的问题。

正如您自己所说,您可以使用可序列化接口序列化对象,但您也可以将其序列化为 JSON 对象。我还要说,如果您需要在活动之间传递复杂的数据结构,您确实需要重新考虑您的设计。您可能应该有一些全局应用程序状态(在您的 Application 或类似类中),并且只传递可用于从应用程序状态查找数据的 id、键或类似内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多