我正在编写一个简单的android应用程序,它基本上是对android文档中可用的片段演示的修改。 在应用程序中,有一个名为Ipsum.java的文件,它有一个名为Headlines的字符串静态ArrayList。
在main活动的onCreate()方法中,我有以下代码,它将一些元素添加到数组列表中。
if (savedInstanceState == null){
Ipsum.Headlines.add("String 1 ");
Ipsum.Headlines.add("String 2");
}
savedInstanceState是系统传递给方法的Bundle,如果应用程序正从某个非活动状态恢复。逻辑是如果savedInstanceState为null,则应用程序不会被恢复,而是作为新实例启动。
如果我使用“主页”按钮离开应用程序并重新输入应用程序,则arrayList只包含两个元素:“String 1”和“String 2”。 (这是理想的行为)
但是,如果我使用后退按钮离开应用程序,然后重新进入应用程序,则“字符串1”和“字符串2”元素再次 添加 。然后该数组有4个元素。
String 1
String 2
String 1
String 2
(可以看到arrayList的内容,因为它们用于填充listView) 当按下后退按钮时,应用程序似乎正在存储静态数组列表的内容..并且当重新启动应用程序时,Bundle不会传递给onCreate()方法。在应用程序生命周期方面,有人能解释一下这里发生了什么吗?
答案 0 :(得分:10)
愿这可以帮到你:
让我们从一些背景知识开始:启动申请时会发生什么?
操作系统启动一个进程并为其分配一个唯一的进程ID并分配一个进程表。一个进程启动一个DVM实例(Dalvik VM);每个应用程序都在DVM中运行。
DVM管理类加载卸载,实例生命周期,GC等。
静态变量的生命周期:当一个类由JVM
加载时,静态变量就会存在,并在卸载该类时死亡。
因此,如果您创建一个Android应用程序并初始化一个静态变量,它将保留在JVM中,直到出现以下情况之一:
1.班级卸下了
2. JVM关闭了
3.过程终止
请注意,当您切换到另一个应用程序的其他活动时,静态变量的值将保持不变,并且上述三个活动都不会发生。如果上述三种情况中的任何一种发生,静电将失去其价值。
详情:在此链接中阅读 Samuh 的答案... Click Here
答案 1 :(得分:2)
您的活动正在恢复。如果您想控制发生的情况,请实施onResume()
。
有关详细信息,请参阅Managing the Activity Lifecycle。
编辑:
静态变量是Java概念。 static
只意味着整个类只有一个变量副本。另一种选择是每个对象都有自己的副本。
因此,当您的代码正在运行时,您只需在程序中拥有变量的一个副本。它不会在任何地方保存,除非您添加代码来执行此操作。
答案 2 :(得分:0)
静态变量与类相关联,只要类在内存中,它们就会存在,并且在类被卸载时会破坏(很少发生)。它可能发生在 -
-You force stop your app.
-Application crashes.
-You clear your app data.
-Switch off your Device(Shutdown DVM).