我想问一下用参数调用Activity。我见过很多关于它的例子。但我想问一个解释为什么用某种方式“不容易”或“不简单”来创建(调用)带有自定义参数的活动。
我见过很多帖子,比如this和其他人。人们传递字符串而不是自定义对象。是的,他们通过实现可序列化和parceable方法传递自定义对象,但这似乎没有效率(我可能错了,因为没有看到它)。对于最终声明的类,还有更多工作要做。
当我们使用 putExtras(String name,String value)传递String时,为什么没有定义像 putExtras(String name,Object object)这样的函数?通过它传递任何自定义对象会不会更容易?
关于流程的复杂性,在帖子here
中给出了解释因为应用程序处于不同的进程中,并且具有单独的内存 地址空间,你不能只是发送指针(引用)到内存块 在你的过程中,并期望它在另一个过程中可用。
但是,我找不到让我满意或帮助我意识到自己没有看到的理由。好的,假设应用程序处于不同的进程中,并且它们的内存空间不同。那么我们是否要将数据复制到另一个活动的内存空间?或者至少,不应该属于同一个应用程序的活动(我相信应用程序中的活动具有与其应用程序相关的通用内容)具有共同的内存空间,以便它们可以轻松共享或传递数据?
我只是想澄清一下这一点。我知道Android不应该与Windows开发相比,但感觉如果事情变得更简单可能会更好。我知道我对此缺少一些东西,否则每个人都知道更简单会更好。但是什么阻止传递更容易的事情呢?
感谢。
答案 0 :(得分:0)
为什么没有定义像putExtras(String name,Object object)这样的函数?通过它传递任何自定义对象会不会更容易?
因为startActivity()
总是越过进程边界,因此传递的任何内容都需要转换为字节数组以进行传输。
那么我们要复制要传递到另一个活动的内存空间的数据吗?
我们正在进程之间复制数据。
或者至少,不应该属于同一个应用程序的活动(我相信应用程序中的活动有一些与其应用程序相关的通用内容)具有公共内存空间,以便它们可以轻松共享或传递数据?
除了startActivity()
的主要工作不是由您的申请流程完成,而是由核心操作系统流程完成。
我知道Android不应该与Windows开发相比,但感觉如果事情变得更简单可能会更好。
更好的类比是Web开发,您不在客户端和服务器之间传递对象,而是将数据编组到字符串或字节数组中。
答案 1 :(得分:0)
正如您已经想到的那样,您通过Bundle在活动之间传递数据,如下所示:
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra(key, "some string");
intent.putExtra(key, true);
intent.putExtra(key, 1.5f);
问题在于,Intents和Bundles是一种非常通用的方式,不仅可以在您自己的活动之间传递数据,还可以传递给其他应用程序,例如启动消息传递客户端并提供预定义的主题和正文。这是非常强大的,但它也是一个约束。如果您想通过MyFooClass怎么办?好吧,你不能这样做,因为Intent是一种执行操作的抽象方式,不仅仅是在你自己的应用程序中。有人可能会说谷歌应该对你自己的活动之间的意图做出例外,但我真的不认为这是一个非常大的问题。
正如您所说,您可以使用可序列化接口序列化对象,但您也可以将其序列化为JSON对象。我还要说,如果你需要在活动之间传递复杂的数据结构,你真的需要重新考虑你的设计。您应该具有一些全局应用程序状态(在您的应用程序或类似的类中),并且只传递可用于从应用程序状态查找数据的ID,密钥或类似物。