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

jss*_*4n5 26 java static android android-lifecycle android-activity

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

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

怎么了:

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

  2. 变量"foo"不存在?

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

nan*_*esh 27

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

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

  • 如果进程未被杀死会发生什么,只有活动被销毁(假设某些服务正在运行).当Activity再次启动时,静态变量是否与最后存储的值一起存在? (9认同)
  • 如果没有杀死进程,将保留@jane静态变量 (2认同)
  • @Ahmed是的,静态变量仍然存在. (2认同)

aga*_*mov 10

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

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

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


Ted*_*opp 7

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