我正在创建事件搜索应用程序,我们设置搜索条件从一个屏幕填充到另一个屏幕,然后用户可以编辑搜索条件从第3个屏幕,并前往第4个屏幕。
为了实现上述任务,我使用静态对象,记住周围的应用程序的值,我不需要做任何额外的事情。
但我担心,如果关于静态对象的生命周期在Android中,如果低内存发现Android删除静态对象???
由于Android支持多任务处理,如果用户切换到另一个应用程序,当用户回来时,应用程序开始疯狂,静态对象是否会在多任务处理时被删除??有什么想法吗??还建议通过单例方法持有静态对象是更好的方法???
4条答案
按热度按时间9cbw7uwe1#
让我们从一些背景知识开始:启动应用程序时会发生什么?
操作系统启动一个进程,给它分配一个唯一的进程ID,并分配一个进程表,进程启动一个DVM(Dalvik VM)示例;每个应用程序都在DVM中运行。
DVM管理类加载卸载、示例生命周期、GC等。
静态变量的生存期:静态变量在类被JVM加载时出现,在类被卸载时死亡。
因此,如果您创建一个android应用程序并初始化一个静态变量,它将一直保留在JVM中,直到发生以下情况之一:
1.该类将被卸载
1.该工艺模具
请注意,当您切换到另一个应用程序的不同Activity时,静态变量的值将保持不变,而上述三种情况均未发生。如果发生上述三种情况中的任何一种,静态变量将失去其值。
您可以使用几行代码对此进行测试:
1.打印Activity的onCreate中未初始化的静态-〉应打印null
1.初始化这静态.打印它-〉值将是非空的
1.点击返回按钮,返回主屏幕。主屏幕是另一个活动。
1.再次启动Activity-〉静态变量将为非空
1.从DDMS中终止应用程序进程(设备窗口中的停止按钮)。
1.重新启动您的活动-〉静态将具有空值。
isr3a4wc2#
Singleton模式也是基于使用静态变量的,所以实际上你会处于相同的位置。虽然静态方法可能在大多数时候都有效,但在某些情况下,当内存已满,另一个Activity在应用程序移动到下一个屏幕之前占据前台时,您的Activity进程可能会被终止,您将丢失静态值。不过,Android提供了一些选项,可用于在状态之间持久保存值或传输值,例如:
您可以通过查看谷歌代码或其他开源Android应用程序中的aegis-shield源代码树来获得一些使用首选项、意图和sqlite数据库的代码示例。
8iwquhpp3#
经过一番研究之后,我们发现使用Application来存储单例并不是一个好主意,除非您准备重新创建它:
Don't store data in the application object
因此,虽然the accepted answer在技术上是正确,但它并没有提供所有信息。
正如上面的链接所建议的,如果您真的想坚持使用该模型,您需要准备好检查空值并重新创建数据(如果可能的话)。
xmq68pz94#
@r1k0就在这里。在类的静态字段中存储数据不会在应用程序进程终止和重启时保持不变。Android通常会在需要内存时终止进程(正在运行的应用)。
根据Android文档:活动状态和从存储器弹出,
系统不会直接终止一个活动,而是终止运行该活动的进程,不仅会破坏该活动,还会破坏进程中运行的所有其他内容。
您可以使用下面的方法保存和恢复原语以及Serializable和Parcelable对象的状态。这些方法会在正常的活动生命周期中自动调用。
因此,如果您的类只有静态变量,您可以在onSaveInstanceState()中保存每个字段的状态,并在onRestoreInstanceState()中恢复它们。当Android终止应用正在运行的进程时,变量的状态将被保存,当Android恢复应用时,值将以与之前相同的状态恢复到内存中。