传递对活动意图的引用

本文关键字:引用 意图 活动 | 更新日期: 2023-09-27 18:18:14

很长一段时间以来,我在将变量从一个Activity传递到另一个Activity时遇到了麻烦,而且我通常不得不解决一些非常丑陋的static -class hack来使它工作。

通常沿着静态方法的线条,我调用活动的类型,以及活动需要的变量。这些将被存储在一个静态变量中,并在该活动的构造函数中检索。

就像我说的,很丑。也没有myActivity这样的东西。StartActivity(新活动);"。StartActivity的所有重载要么接受一个Intent,要么接受一个(MyOtherActivity)类型。

所以我的问题是,我完全误解了活动的概念,或者我只是错过了一个完全明显的方式来传递参数给他们?

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

我正在使用Xamarin编写应用程序。Android,但是代码在c#和Java之间几乎是相同的,所以用这两种语言中的任何一种都可以。

传递对活动意图的引用

问题是Android可以在任何时候杀死承载你的应用程序的进程(如果它在后台)。当用户返回到你的应用程序时,Android将创建一个新进程来托管你的应用程序,并将在堆栈的顶部重新创建Activity。为了做到这一点,Android保留了Intent的"序列化"版本,以便它可以重新创建Intent以将其传递给Activity。这就是为什么Intent中的所有"extra"都需要是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类上这样做,因为这个类是在App启动时调用的,所以你不必手动启动它。
请记住,范围为Application的变量通过扩展将其生命周期范围扩展到应用程序。
如果Android认为有必要,那么该类将被垃圾收集,因此您必须修改代码以包含这种情况。
你可以使用SharedPreferencesDatabase来保存变量,以防它们被删除,并从App类中检索它们,以获得更快的结果。

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

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

不要忘记在OnStopOnDestroy上释放需要的资源
我很少使用intent,我觉得这样更好。