Android 用于在活动之间传递对象的全局变量的替代方案

Android 用于在活动之间传递对象的全局变量的替代方案,android,Android,我需要在活动之间传递对象列表,我在应用程序类中使用公共静态全局变量 问题是,当活动在后台运行一段时间时,这个变量似乎是第一个被销毁的变量 我在后台进行活动时从来没有遇到过问题,但每当我使用这样的全局变量时,它总是首先被垃圾收集,或是一些需要占用内存的东西。这会导致我的应用程序崩溃 如何防止这种情况发生?最简单的解决方法是启动其他活动。这需要您的对象实现或 然后打电话: Intent intent = getIntent(); intent.putExtra("myobjects", listOf

我需要在活动之间传递对象列表,我在应用程序类中使用公共静态全局变量

问题是,当活动在后台运行一段时间时,这个变量似乎是第一个被销毁的变量

我在后台进行活动时从来没有遇到过问题,但每当我使用这样的全局变量时,它总是首先被垃圾收集,或是一些需要占用内存的东西。这会导致我的应用程序崩溃


如何防止这种情况发生?

最简单的解决方法是启动其他活动。这需要您的对象实现或

然后打电话:

Intent intent = getIntent();
intent.putExtra("myobjects", listOfObjects);
getContext().startActivity(intent);

在android中使用globel静态变量是不好的做法。当您的活动转到后台时,GC将始终删除它们,因为不再使用该值。也不要试图让你的对象在你需要的时候在内存中保留更长的时间。这可能会导致内存较少的设备性能不佳

正如SME_-Dev所说,您需要序列化您的对象,并将它们作为额外的意图传递给活动


当你可以对你的对象进行序列化时,如果应用程序被破坏,你也可以更容易地恢复它的当前状态,因为你可以在android中使用。这是一种不好的方法,将它存储在全局变量中。 您应该序列化类,或者创建一个单例模式并将该对象存储在其中

可串行化方法

public class ClassIntanceOne implements Serializable{
}

//In Activity
ClassIntanceOne class_instance_one = new ClassIntanceOne();
Bundle bundle = new Bundle();  
bundle.putSerializable("object1", class_instance_one);
intent.putExtras(bundle);
startActivity(/*Your class*/);

您可以使用
捆绑包
将数据传递给活动,目的是在答案中添加太多废话!确实,正确的方法是序列化对象并传递它们。然而,Android并不随机使用GC变量。在
应用程序
单例中,它永远不会“重置”静态变量,也不会使用任何其他您想要使用的词。很简单,你的应用程序进入后台并被销毁。当您返回应用程序时,它将重新启动,以便将变量设置为其初始值。如果要保留它们的值,请将它们存储并重新加载到
Application.onCreate()
。对不起,这是胡说八道。只要POJO包含类的任何实例存在,POJO中的静态变量就存在。
应用程序
单例的静态生命周期等于应用程序实例的生命周期。请看我上面的评论。也许我的表述是错误的。我同意只要app实例可用,变量就存在,但是GC仍然收集不再引用的类。在这种情况下,对象列表被收集,因为引用它的活动已消失。变量仍然存在,但包含null。
在本例中,对象列表被收集,因为引用它的活动已消失。变量仍然存在,但包含null
Nope。试试看,真的很容易。创建
应用程序的静态类。现在在
活动中设置它的值
finish()
完成该活动并开始另一个活动。现在读取值。如果将应用程序保持在前台,则该静态值将在应用程序的生命周期内保持不变。不管它是原语还是对对象的引用,它都将保持不变。这就是为什么如果不小心使用它会如此危险的原因。换句话说,似乎存在这样一个城市神话:Android上的Java与其他内存管理、扫描和标记语言有所不同。事实并非如此。对象范围和生命周期的规则完全相同。一个变量永远不会被GCed,不管它指向什么对象,如果它包含类的任何实例存在的话。因此,不会对任何变量进行GCD,因为如果它引用的对象的引用不存在,那么它就不可能存在<代码>当您的活动转到后台时,GC将始终删除它们,因为不再使用该值
-这完全是错误的。但是如果应用程序在后台停留一段时间->get的GCed,则会卸载
应用程序
类。当然,这种行为与任何其他java都是一样的,但由于较长的非活动时间,应用程序被破坏的可能性非常高。有些设备甚至会在按下后退按钮后立即销毁应用程序。不管怎样,请将其序列化:-)