繁体   English   中英

传递对Activity Intent的引用

[英]Passing references to Activity Intent

很长一段时间以来,我遇到了将变量从一个Activity传递到另一个Activity的麻烦,而且我通常不得不解决一些相当丑陋的静态类hack来使其工作。

通常我使用Activity的类型调用静态方法的行,以及Activity需要的变量。 这些存储在静态变量中,并在所述活动的构造函数中检索。

就像我说的那样,非常难看。 并且没有“myActivity.StartActivity(new Activity);”这样的东西。 StartActivity的所有重载都采用Intent或typeof(MyOtherActivity)。

所以我的问题是,我是否完全误解了活动的概念,或者我只是错过了一种将论据传递给他们的完全明显的方法?

@Edit:我想传递对象的实际引用而不是简单地传递对象副本的原因是因为我试图将一个View Model从一个覆盖的Activity传递到新的Activity。 当然,对此视图模型所做的任何更改都应该反映在父活动上,只有当两个activy的viewmodel指向同一个实例时才能实现。

我正在使用Xamarin.Android编写应用程序,但C#和Java之间的代码几乎相同,所以这两种语言的答案都很好。

问题是Android可以随时终止托管您应用的进程(如果它在后台)。 当用户返回到您的应用程序时,Android将创建一个新进程来托管您的应用程序,并将在堆栈顶部重新创建Activity 为了做到这一点,Android保留了Intent的“序列化”版本,以便它可以重新创建Intent以将其传递给Activity 这就是为什么Intent中的所有“额外”都需要是ParcelableSerializable

这也是您无法传递对象引用的原因。 当Android重新创建进程时,这些对象都不会再存在。

另一点需要考虑的是,不同的活动可能会在不同的流程中运行。 即使来自同一应用程序的活动也可能在不同的进程中(如果清单指定了这一点)。 由于对象引用不适用于进程边界,因此这是您无法将引用传递给Intent的对象的另一个原因。

您还可以使用Application类来全局存储对象并检索它们:

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";

我选择在Application calss上执行此操作,因为在App启动时调用此类,因此您不必手动启动它。
请记住,作用于Application变量的生命周期范围通过扩展名应用于应用程序。
如果Android认为有必要,则此类将为Garbage Collected,因此您必须修改代码以包含此案例。
您可以使用SharedPreferencesDatabase保存变量,以防它们被删除并从App类中检索它们以获得更快的结果。

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

调查您需要在应用程序范围内保存哪些信息,以及可以直接从数据库中检索哪些信息。 对两者都有成本影响,您需要确保您获得正确的平衡。

并且不要忘记在OnStopOnDestroy上根据需要释放资源
我很少使用意图,我觉得这样更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM