公共静态变量和Android活动生命周期管理

时间:2012-08-30 03:33:39

标签: java android static android-activity android-lifecycle

根据文档,Android操作系统可以杀死后台堆栈后面的活动。

所以,比如说,我有一个应用程序并打开主要活动(让我们称之为活动A)。在这个公共活动类中,我声明并初始化一个公共静态变量(让我们称之为“foo”)。在Activity A的onCreate()方法中,我然后更改“foo”的值。从活动A开始,用户在我的应用程序中启动另一个名为Activity B的活动。在活动B中使用变量“foo”。在用户导航到其他应用程序中的某些其他活动后,活动B将暂停。最终,在发生内存不足之后,可以杀死活动A然后活动B.用户导航回我的应用程序后,它会重新启动(实际上是“重新创建”)活动B.

会发生什么:

  1. 此时变量“foo”是否具有在活动A的onCreate()方法运行时设置的值?

  2. 变量“foo”不存在?

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

3 个答案:

答案 0 :(得分:25)

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

因此,您在活动A中设置的任何值都不会持续

答案 1 :(得分:10)

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

以下是针对想要手动测试此问题的用户的一些说明: 创建android v.4模拟器,然后转到设置 - >开发者设置 - >禁用后台任务。 然后用2个活动创建示例android项目, 在活动A中声明静态变量,在onCreate()方法中初始化它。 在活动A中放置一个按钮,开始活动B. 在Activity B的onCreate()方法中,将A.staticVar的值打印到logcat。

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

答案 2 :(得分:7)

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