2015-09-06 94 views
2

假设我有一个包含两个活动(Activity1和Activity2)的Android应用程序。在Activity1中,我声明了一个public static Boolean foo = trueAndroid中公共静态变量的使用情况

当我finish()活动1,并移动到活性2,我能看到“foo”的变量值true

但是,当系统内存不足(例如,由于有在设备上运行许多应用程序),然后,当我在Activity2上时,我看到“foo”变量的值是null

这是如何解释的?

+2

此问题的答案可能是解决您的问题。 http://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app – HyperZ

+0

我不明白的是,当我完成()Activity1时,为什么我可以看到“foo”是真实的,当系统杀死它时,“foo”的值为空 – Fivos

+0

可能是因为'null'是静态'foo'变量的缺省值,就像@Kishan Vaghela的答案中指出的那样。 – HyperZ

回答

4

需要注意的是一个静态变量的生命是联系在一起的过程不是活动是很重要的。即使您的活动已被销毁,静态变量仍将保持活动状态(这就是为什么您看到它的值设置为true)。只有当进程被销毁时,静态变量才能被正确释放。

这也是您不应该使用静态变量来保存对活动,上下文或视图的引用的原因之一。巨大的内存泄漏等待发生。

为您的特定情况下,这意味着:

  • ACT1创建&设置变量;你从ACT1转移到ACT2
  • 的过程在BG
  • 当系统试图恢复你,你最终回到ACT2
  • 但是杀害,因为该变量的初始化在ACT1发生, (尚未初始化)变量未被设置。
+0

谢谢你@Colt McAnlis你的明确答案。在senario中,进程被销毁了,并且我在应用程序的Activity2中为什么变量为null?我的启动器活动是Activity1,所以变量“foo”在移动到Activity2之前应该已经重新初始化为“true”。我错过了什么? – Fivos

+1

编辑我的答案是更具体到您的情况。 –

0

如果进程被终止,那么所有静态变量将被重新初始化为其默认值。

所以,无论价值,你在活动1已设置不会存留

+0

我认为这个过程没有被杀死,因为那时我的应用程序也会被杀死。你的意思是说Activity1被杀了吗? – Fivos

+1

您的进程**很可能会被杀死**。 “如果其他具有更高优先级的应用程序(通常,如果它处于前台,它的优先级更高)需要资源,则实际上通常会导致您的应用程序死亡。这是由于资源相对有限的移动设备的本质。“ - > http://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app请同时阅读评论。 .. – HyperZ

+0

我上面说过,我认为这个过程并没有因为我的应用程序在前台发生这种情况而死亡,所以如果这个过程被终止了,我的应用程序就会关闭。 – Fivos

0

您呼吁活动类,类name.static变量静态变量。

的Class1:

Public class1 extends Activity{Public static boolean foo = true;} 

等级2:调用class1的变量

Public class2 extends Activity { class1.foo // call variable } 
+1

这回答OP的问题是什么? OP已经知道如何调用变量,因为他能够看到“foo”的值。但是他不知道为什么它的值突然变为'null'。 – HyperZ