Java 传递对活动意图的引用

Java 传递对活动意图的引用,java,c#,android,xamarin,xamarin.android,Java,C#,Android,Xamarin,Xamarin.android,在相当长的一段时间里,我在将变量从一个活动传递到另一个活动时遇到了麻烦,我通常不得不解决一些非常难看的静态类问题,以使其正常工作 通常,我调用的静态方法与活动类型以及活动所需的变量类似。它们存储在静态变量中,并在所述活动的构造函数中检索 就像我说的,很难看。没有“myActivity.StartActivity(新活动)”这样的东西。StartActivity的所有重载要么采用Intent,要么采用typeof(MyOtherActivity) 所以我的问题是,我是否完全误解了活动的概念,或者我

在相当长的一段时间里,我在将变量从一个活动传递到另一个活动时遇到了麻烦,我通常不得不解决一些非常难看的静态类问题,以使其正常工作

通常,我调用的静态方法与活动类型以及活动所需的变量类似。它们存储在静态变量中,并在所述活动的构造函数中检索

就像我说的,很难看。没有“myActivity.StartActivity(新活动)”这样的东西。StartActivity的所有重载要么采用Intent,要么采用typeof(MyOtherActivity)

所以我的问题是,我是否完全误解了活动的概念,或者我只是缺少了一种完全显而易见的方式来向他们传递论点

@编辑:我希望传递对象的实际引用而不是对象的副本的原因是,我试图将视图模型从上覆活动传递到新活动。当然,对这个视图模型所做的任何更改都应该反映在父活动上,这只有在两个activy的viewmodels指向同一个实例时才可能实现


我正在使用Xamarin.Android编写应用程序,但是C#和Java之间的代码几乎相同,所以用这两种语言中的任何一种都可以。问题是,Android可以随时终止承载应用程序的进程(如果它在后台)。当用户返回到您的应用程序时,Android将创建一个新进程来托管您的应用程序,并在堆栈顶部重新创建
活动。为了做到这一点,Android保留了
Intent
的“序列化”版本,以便可以重新创建
Intent
以将其传递给
活动。这就是为什么
Intent
中的所有“额外”都需要是
可打包的
可序列化的

这也是为什么不能传递对对象的引用。当Android重新创建该过程时,这些对象将不再存在


另一个要考虑的是不同的活动可能在不同的过程中运行。即使来自同一应用程序的活动也可能位于不同的进程中(如果清单指定了这一点)。由于对象引用不跨流程边界工作,这是无法在
意图中传递对象引用的另一个原因。您还可以使用应用程序类全局存储对象并检索它们:

using Android.Runtime;

namespace SomeName
{
[Application]
public class App : Application
{
public string Name { get; set;}

public App (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}

public override void OnCreate ()
{
    base.OnCreate ();

    Name = "";
}
}
}
您可以通过以下方式访问数据:

App application = (App)Application.Context;
application.Name = "something";
我选择在
应用程序上执行此操作,因为该类在应用程序启动时被调用,因此您不必手动启动它。
请记住,作用于
应用程序的变量通过扩展将其生存期作用于应用程序。
如果
Android
认为有必要,则此类将被垃圾收集,因此您必须修改代码以包含此案例。
您可以使用
SharedReferences
数据库
保存变量,以防它们被删除,并从应用程序类中检索它们以获得更快的结果

不过,在使用这种方法时不要太浪费时间,因为在这个类上附加太多信息可能会导致性能下降。只添加您知道应用程序不同部分需要的信息,以及检索该信息的成本超过将其存储为应用程序变量的成本的信息

调查哪些信息需要作为应用程序范围的状态保存,以及哪些信息可以直接从数据库中检索。两者都有成本影响,你需要确保平衡

别忘了在
OnStop
OnDestroy
上根据需要释放资源

我很少使用意图,我发现这种方法更好。

部分正确的可能重复。您提供的链接上的答案回答了如何将基本值类型(如int和string)移动到单独的活动,而不是如何传递实际的引用对象(如我自己的自定义类型的对象)。Google为您搜索了它。是的,但所有这些结果都表明它是可序列化的。这意味着我将失去对对象的引用。这正是我想要保留的。换句话说,我想给它的不是一个对象,而是一个对象的引用。你为什么要这样?请更新您的问题,说明您的原因。从您所说的,考虑到您永远不知道应用程序的哪个部分正在运行,因此很难创建一个在稍后退出并再次进入应用程序时不会中断的导航流,因此制作应用程序的环境听起来非常不稳定。这是真的吗?是的,这是真的。这意味着您需要在设计应用程序时牢记这一点。你不是第一个遇到这个问题的Android开发者,也不会是最后一个。这就是OP在谈到使用“静态变量”时所指的。您不需要
应用程序
类,只需使用静态变量即可。OP正在寻找更“优雅”的解决方案;-)谁是OP?:),有了应用程序类,你可以做员工,并确保在应用程序开始时一直做到结束。为什么这个解决方案不优雅?什么样的解决方案才是“优雅的”?Android对全局变量的集成支持?在右边的bug中,只是一些背景信息,说明为什么这有点不稳定。。。您的进程随时可能被操作系统终止(例如:活动已成为后台一段时间,其他应用程序的高内存压力等),您甚至不会注意到,
应用程序
类可能会被拆除并重新创建。在这种情况下,
Name
属性将被重置;一个改进的解决方案是通过getter和setter将其持久化到共享首选项,或者通过d