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

Posted

技术标签:

【中文标题】公共静态变量和Android活动生命周期管理【英文标题】:Public static variables and Android activity life cycle management 【发布时间】:2012-08-24 17:52:15 【问题描述】:

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

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

会发生什么:

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

    变量“foo”不存在?

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

【问题讨论】:

【参考方案1】:

如果进程被杀死,那么所有的静态变量都会被重新初始化为它们的默认值。

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

【讨论】:

如果进程没有被杀死,只有活动被破坏会发生什么(假设某些服务正在运行)。当Activity再次启动时,静态变量是否会存在最后存储的值? @jane 静态变量将在进程未被杀死时保持 @Ahmed 是的,静态变量仍然存在。 @nandeesh 新类的静态变量怎么样?我在 Activity1 中设置另一个类的静态变量,然后切换到 Activity2。当我在新活动中打印值时,我看不到我设置的值。它采用默认值。基于 Java 中静态变量的默认行为,我会说这不是预期的行为。所以,我想知道这里发生了什么。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

@Criticalquestionnaire - 我不确定您在寻找什么,但请参阅Storage Options 上的指南主题了解如何持久化数据。

以上是关于公共静态变量和Android活动生命周期管理的主要内容,如果未能解决你的问题,请参考以下文章

(Android第一行代码活动的生命周期)生命周期

Android 应用程序类生命周期

Android笔记-活动生命周期&Bundle回收临时数据&活动启动模式&常用技巧

[Android]Activity的生命周期

android学习笔记28——Activity生命周期

Android入门Activity-生命周期与启动模式