【发布时间】:2011-05-28 19:08:34
【问题描述】:
在相当长的一段时间里,我很高兴地认为只要应用程序运行,静态 [实例] 变量就存在。然而,令我沮丧和震惊的是,我觉得这不是真的。
仅用于测试,我创建了一个静态字符串列表,并在我的主要 activity 类中覆盖了 onDestroy 方法以打印一条消息以验证应用程序是否退出。在onCreate 方法中,我只是添加了一个新的string,并打印了列表的内容。我发现列表的大小不断增加,并且之前添加的所有字符串值仍然存在。
我已经在某些地方 [甚至在 SO 上] 读到,只要应用程序存在,实例变量就存在,但我担心事实并非如此。
更准确地说,我是在使用 Facebook SDK for Android 时意识到这个问题的。我已经看到SessionEvents 类中的侦听器列表中的AuthListener 实例随着时间的推移不断增加。因此,无论何时启动应用程序并且用户使用 FB 登录,监听器方法都会被触发,其次数与 SessionEvents 类中存在的实例一样多。
以前有人观察过这一点,我在理解 android 的工作原理方面是否犯了一些重大错误?
什么给了?
感谢阅读!
[更新]
我接受BalusC 和rdineiu 的纠正。我真的不是要在这里制造关于实例和类变量的混淆。唉,在我匆忙发布我的问题时,我犯了一个我不想犯的错误。我非常清楚static 和instance 变量之间的区别。我只是打算写class 变量,并不能完全弄清楚是什么将静态变量称为instance 变量。
但是,我的问题仍然存在。
@MisterSquonk - 不,我不会在这里混淆我的Activity 何时结束以及应用程序何时被破坏。这是我在样本上尝试过的——我只有一个Activity,它充当Main。当我从这个Activity 按下返回按钮时,我假设Activity 从堆栈中删除并且应用程序也被破坏。我已启动任务管理器以验证我的应用不再运行。
【问题讨论】:
-
静态变量 != 实例变量
-
与您的问题没有直接关系,但参考您所说的内容......“在我的主要活动类中覆盖了 onDestroy 方法以打印一条消息以验证应用程序已退出” - 不要混淆与应用程序的活动。杀死一个活动并不一定会杀死应用程序(“应用程序”)。
-
@MisterSquonk - 不,我没有造成任何混淆。在我的特定应用程序中,我很确定
activity的杀戮也意味着该应用程序不再运行。我使用任务管理器对其进行了验证,并更新了帖子以提及相同的内容。