Answers:
让我们从一些背景开始:启动应用程序时会发生什么?
操作系统启动一个进程并为其分配唯一的进程ID并分配一个进程表。一个进程启动DVM(Dalvik VM)的实例;每个应用程序都在DVM中运行。
DVM管理类加载卸载,实例生命周期,GC等。
静态变量的生存期:静态变量在JVM加载类时存在,而在卸载类时死亡。
因此,如果您创建一个android应用程序并初始化一个静态变量,它将保留在JVM中,直到发生以下情况之一:
1.卸载该类
2. JVM关闭
3.进程 终止
请注意,当您切换到另一个应用程序的不同活动时,静态变量的值将保持不变,并且以上三个都不发生。如果以上三种情况中的任何一种发生,则静电将失去其价值。
您可以使用以下几行代码进行测试:
希望能有所帮助。
好吧,单例模式也基于使用静态变量,因此实际上您将处于同一位置。尽管静态方法在大多数情况下都可以使用,但是在某些情况下,当内存已满并且其他活动占据了前台,然后您的应用程序移至下一个屏幕时,可能会发生,您的活动过程可能会被杀死,并且您会丢失静态值。但是,Android提供了一些在状态之间保留值或传输状态的方法,例如:
通过查看google代码或其他开放源代码Android应用程序中的盾构源代码树,可以获取一些使用首选项,意图和sqlite数据库的代码示例。
经过研究后,发现使用Application存储单例并不是一个好主意,除非您准备重新创建它:
因此,尽管已接受的答案在技术上是正确的,但并不能提供所有信息。
正如上面的链接所暗示的,如果您确实想坚持使用该模型,则需要准备检查空值并在可能的情况下重新创建数据。
@ r1k0就在这里。在类的静态字段中存储数据将不会在整个应用程序进程终止和重新启动时自行保留。Android通常会在需要内存时杀死进程(正在运行的应用程序)。
根据Android文档:活动状态和从内存中弹出,
系统永远不会直接杀死活动。相反,它杀死了活动在其中运行的进程,不仅破坏了活动,而且还破坏了该进程中运行的所有其他事物。
您可以使用以下方法保存和还原基元以及可序列化和可打包对象的状态。在正常活动生命周期中会自动调用它们。
protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}
因此,如果您的类只包含静态变量,则可以将每个字段的状态保存在onSaveInstanceState()中,然后将其还原到onRestoreInstanceState()中。当Android终止您的应用程序正在运行的进程时,变量状态将被保存,而Android还原您的应用程序时,值将以与以前相同的状态恢复到内存中。