28

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

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

发生什么了:

  1. 此时变量“foo”是否会具有 Activity A 的 onCreate() 方法运行时为其设置的值?

  2. 变量“foo”不存在?

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

4

3 回答 3

28

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

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

于 2012-08-30T03:36:43.040 回答
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。但在此步骤中,由于 A.staticVar 将为空,程序将因 NullPointerException 而崩溃,我们正在尝试将其打印到 logcat。

于 2012-12-25T21:26:47.150 回答
7

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

于 2012-08-30T03:39:18.847 回答