2012-08-30 58 views
23

根据文档,Android OS可以终止后台堆栈的活动。公共静态变量和Android活动生命周期管理

因此,举个例子,我有一个应用程序,并打开主要活动(让我们称之为活动A)。在这个公共活动类中,我声明并初始化一个公共静态变量(我们称之为“foo”)。然后,在Activity A的onCreate()方法中,更改“foo”的值。从活动A开始,用户在我的应用程序中启动另一个名为活动B的活动。在活动B中使用变量“foo”。然后在用户导航到其他应用程序中的其他活动后,活动B暂停。最终,在发生内存不足之后,活动A然后活动B可能会被终止。用户返回到我的应用程序后,将重新启动(实际上是“再现”)活动B.

会发生什么:在这一点上

  1. 威尔变“富”有被设置为它当值Activity的onCreate()方法运行?

  2. 变量“foo”不存在?

  3. 变量“foo”存在,但现在是初始化值,而不是在Activity A的onCreate()方法中设置的值?

回答

23

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

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

+0

谢谢你的回答 – jsstp24n5

+0

+1完美答案:) – Lucifer

+8

如果进程没有被杀死,只有活动被破坏(假设某些服务正在运行)会发生什么。当Activity再次开始时,静态变量是否会与上次存储的值一起存在? – Ahmed

7

答案是(3)。如果您需要保留值,请在每个活动暂停时将其保留在共享首选项中,并在恢复时将其恢复。或者,您也可以维护一个“初始化的”静态标志,并在任何活动的onCreate()方法中重新初始化静态变量(如果它为假)。

+0

谢谢你的回答。 – jsstp24n5

+0

@Criticalquestionnaire - 我不确定你在找什么,但请参阅[存储选项](http://developer.android.com/guide/topics/data/data-storage.html)上的指导主题。如何坚持数据。 –

10

很好的解释在这里可以查看从2:50 http://www.infoq.com/presentations/Android-Design

这里是为那些谁想要手动测试这个问题的一些说明: 创建的Android模拟器第4节,然后去设置 - >开发人员设定 - >禁用后台任务。 然后用2个活动创建示例Android项目, 在活动A中声明静态变量,并在onCreate()方法中初始化它。 在启动活动B的活动A中放置一个按钮。 在活动B的onCreate()方法中,将A.staticVar的值打印到logcat。

启动项目 - 活动A出现。点击按钮 - 活动B出现,静态变量的值被打印到logcat。按主页按钮并启动任何其他程序 - 您的示例项目过程将被终止(因为您禁用了后台进程)。 现在长按主页按钮 - 您将看到最近启动的程序列表。选择你的示例项目 - 操作系统将尝试恢复你的项目的活动后备堆栈并重新创建上次运行的活动B.但是在这一步,程序将因NullPointerException异常而崩溃,因为A.staticVar将为空,并且我们试图将它打印到logcat。