仅仅进行测试,我创建了一个静态字符串列表,并在我的主activity
类中覆盖了onDestroy
方法以打印消息以验证应用已退出。在onCreate
方法中,我只添加了一个新的string
,并打印了列表的内容。我发现的是列表的大小不断增加,之前添加的所有字符串值仍然存在。
我已经阅读了[甚至在这里的SO],只要应用程序确实存在实例变量,但我担心它并非如此。
更准确地说,我在使用Facebook SDK for Android时意识到了这个问题。我已经看到AuthListener
类中的监听器列表中的SessionEvents
个实例随着时间的推移不断增加。因此,无论何时启动应用程序并且用户使用FB登录,监听器方法都会被触发,因为SessionEvents
类中存在实例。
之前是否有人观察到这一点,并且是否有一些重大错误我正在致力于理解android是如何工作的?
是什么给了什么?感谢阅读!
[更新]
我被BalusC
和rdineiu
更正了。我真的不想在这里创建关于实例和类变量的混淆。唉,我急忙发布我的问题,我犯了一个我不想做的错误。我非常清楚static
和instance
变量之间的区别。我只想编写class
变量,并且无法弄清楚将静态变量称为instance
变量的过程。
然而,我的问题仍然存在。
@MisterSquonk - 不,我不会在这里混淆我的Activity
何时结束以及应用何时被销毁。这是我在样本上尝试的内容 - 我只有一个Activity
作为Main
。当我按下此Activity
的后退按钮时,我假设Activity
已从堆栈中移除,该应用也会被销毁。我已启动任务管理器以验证我的应用程序已不再运行。
答案 0 :(得分:6)
您似乎没有区分静态变量和实例变量。静态变量是在类本身上定义的。实例变量仅存在于类实例中。
示例:
class Test {
public static int a;
}
变量a
在类本身上定义,而不是在类的实例上定义。每个实例都将访问相同的变量。如果一个实例将a
的值设置为5
,则每个其他实例都会将值视为5
。实例消失后,变量不会消失,因为它与任何实例无关(它是类变量)。它会一直持续到那个时间结束(或者直到应用程序退出,以先到者为准)。
另一方面,以下示例使用实例变量:
class Test {
public int a;
}
此变量只能从类的实例访问。每个实例都有一个不同的变量副本。一旦实例被销毁,变量就会随之而来。
举例说明:
import java.util.List;
import java.util.ArrayList;
class Test {
// instanceVar will be initialized whenever a new Test object is created
private List<Integer> instanceVar = new ArrayList<Integer>();
// staticVar will be initialized right now
private static List<Integer> staticVar = new ArrayList<Integer>();
public void updateInstanceVar() {
instanceVar.add(1);
instanceVar.add(2);
}
public void updateStaticVar() {
staticVar.add(1);
staticVar.add(2);
}
public static void main(String[] args) {
Test test1 = new Test();
test1.updateInstanceVar(); // test1.instanceVar = [1, 2]
test1.updateStaticVar(); // Test.staticVar = [1, 2]
Test test2 = new Test();
test2.updateInstanceVar(); // test2.instanceVar = [1, 2]
test2.updateStaticVar(); // Test.staticVar = [1, 2, 1, 2]
}
}
答案 1 :(得分:6)
所以 - 我在Android Developer Google小组上发布了同样的问题[不幸的是将static
变量称为instance
变量]。
我收到了一些非常好的回复,特别是来自 Kostya 。我在该组上的互动帮助我掌握了Android平台的基本“规则”。
希望message thread能帮到你。
答案 2 :(得分:0)
当应用程序执行时,实例变量会被销毁,但默认情况下,某些gui小部件会保存其状态,然后在onCreate方法中将其恢复。