很长一段时间以来,我在将变量从一个 Activity 传递到另一个 Activity 时遇到了麻烦,而且我通常不得不解决一些非常丑陋的静态类 hack 来使其工作。
通常,我使用 Activity 的类型调用的静态方法以及 Activity 需要的变量。这些存储在静态变量中,并在所述 Activity 的构造函数中检索。
就像我说的,非常丑陋。并且没有“myActivity.StartActivity(new Activity);”这样的东西。 StartActivity 的所有重载都采用 Intent 或 typeof(MyOtherActivity)。
所以我的问题是,我是否完全误解了 Activity 的概念,或者我只是错过了一种向 Activity 传递参数的完全明显的方式?
@Edit:我想传递对对象的实际引用,而不是对象的简单副本,是因为我试图将 View 模型从覆盖的 Activity 向下传递到新的 Activity。当然,对此 View 模型所做的任何更改都应该反射(reflect)在父 Activity 上,这只有在两个 Activy 的 View 模型指向同一实例时才有可能。
我正在使用 Xamarin.Android 编写应用程序,但 C# 和 Java 之间的代码几乎相同,因此使用这两种语言的答案都很好。
最佳答案
问题是 Android 可以随时终止托管您的应用程序的进程(如果它在后台)。当用户随后返回您的应用时,Android 将创建一个新进程来托管您的应用,并将在堆栈顶部重新创建 Activity
。为此,Android 保留了 Intent
的“序列化”版本,以便它可以重新创建 Intent
以将其传递给 Activity
.这就是为什么 Intent
中的所有“额外”都需要是 Parcelable
或 Serializable
的原因。
这也是为什么不能传递对象引用的原因。当 Android 重新创建进程时,这些对象将不再存在。
另一点需要考虑的是,不同的 Activity 可能运行在不同的进程中。即使来自同一应用程序的 Activity 也可能在不同的进程中(如果 list 指定了这一点)。由于对象引用不能跨进程边界工作,这是您不能在 Intent
中传递对对象的引用的另一个原因。
关于java - 传递对 Activity Intent 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211449/