【问题标题】:Does android save static variables?android会保存静态变量吗?
【发布时间】:2013-08-05 16:58:22
【问题描述】:

我正在编写一个简单的 android 应用程序,它基本上是对 android 文档中可用的片段演示的修改。 在应用程序中,有一个名为 Ipsum.java 的文件,其中有一个名为 Headlines 的静态字符串数组列表。

在主要活动的 onCreate() 方法中,我有以下代码,它将一些元素添加到数组列表中。

    if (savedInstanceState == null){
        Ipsum.Headlines.add("String 1 ");
        Ipsum.Headlines.add("String 2");
    }

savedInstanceState 是系统传递给方法的 Bundle,如果应用程序正在从某个非活动状态恢复。逻辑是如果 savedInstanceState 为 null,则应用程序不会被恢复,而是作为新实例启动。

如果我使用“主页”按钮离开应用程序并重新进入应用程序,则 arrayList 仅包含两个元素:“字符串 1”和“字符串 2”。 (这是期望的行为)

但是,如果我使用返回按钮离开应用程序,然后重新进入应用程序,“String 1”和“String 2”元素会再次添加。然后数组有 4 个元素。

String 1
String 2
String 1
String 2

(可以看到arrayList的内容,因为它们是用来填充listView的) 当按下后退按钮时,应用程序似乎正在存储静态数组列表的内容。当应用程序重新启动时,Bundle 没有传递给 onCreate() 方法。有人可以根据应用程序生命周期解释这里发生了什么吗?

【问题讨论】:

  • “如果我使用后退按钮离开应用程序” 要了解的一点是,当您按下时,您不会离开“应用程序” BACK 按钮您只需完成(终止)当前的Activity。如果您有其他应用程序组件,它们很可能会保留在内存中。最重要的是,Service 之类的东西可以继续运行,注册的BroadcastReceivers 可以继续等待广播。
  • 感谢您的澄清。我的应用程序只有一个活动,所以我假设一旦按下后退按钮,应用程序就会“终止”。但是,我对术语有点困惑。一旦应用程序“终止”,它将处于生命周期的哪个状态?供参考:developer.android.com/images/training/basics/…
  • “我假设一旦按下后退按钮,应用程序就会‘终止’。”不,不完全是。在幕后有一个应用程序框架。即使只有一个Activity,按下后退按钮也不会完全从内存中卸载应用程序。 Android 在内存中保留了一个“骨架”应用程序框架,这使得重新启动应用程序变得更快——它将使用最少的资源,但它基本上处于休眠状态。但是,按下BACK 将终止(销毁)Activity,因此,在您发布的链接中,Activity 将处于已销毁状态,即使应用程序仍然存在。

标签: android android-lifecycle static-variables


【解决方案1】:

希望对您有所帮助:

让我们从一些背景知识开始:启动应用程序时会发生什么?

操作系统启动一个进程并为其分配一个唯一的进程id并分配一个进程表。一个进程启动一个DVM(Dalvik VM)的实例;每个应用程序都在 DVM 内运行。 DVM 管理类加载卸载、实例生命周期、GC 等。

静态变量的生命周期:当一个类被JVM加载时,静态变量就存在了,当类被卸载时就死掉了。

因此,如果您创建一个 android 应用程序并初始化一个静态变量,它将一直保留在 JVM 中,直到发生以下情况之一:
1.类被卸载
2.JVM关闭
3. 进程死亡

请注意,当您切换到另一个应用程序的不同活动时,静态变量的值将保持不变,并且上述三个都不会发生。如果上述三种情况中的任何一种发生,则静态将失去其价值。

更多详情:阅读此链接中Samuh的答案...Click Here

【讨论】:

  • 这是否意味着只要用户不关闭应用程序,静态文件就会一直加载在 DVM 中?或者当 Activity 暂停/停止时操作系统可能会完全卸载 DVM,从而随之失去静态状态?
  • 是的,静态变量会一直保留到应用程序仍然存在。但有时当内存不足时,它也可能会被破坏……没有真正的方法可以强制执行此操作。当操作系统决定需要退出应用程序时,通常会在没有正在运行的活动或服务时卸载它们,或者当它运行内存不足并杀死后台应用程序以获取其内存时。
  • @BhavinNattar 至少提及您从哪里复制答案:stackoverflow.com/a/1944564/198996
  • @BhavinNattar,为什么说变量是JVM加载的?为什么android上还有JVM?
【解决方案2】:

静态变量与一个类相关联,只要类在内存中,它们就会存在,并在类被卸载时销毁(这种情况很少发生)。它可能发生在-

 -You force stop your app.
 -Application crashes.
 -You clear your app data.
 -Switch off your Device(Shutdown DVM).

【讨论】:

  • 如果我将变量设为静态,是否需要在 onStop() 中将其设置为 null,因为该类很少被卸载?我有一个游戏,活动结束后不需要资源。如果我调用finish(),静态变量会发生什么?
  • 是的,您可以在 onDestroy() 上的 onStop() 中将其设置为 null。
  • @cjayem13 如果您关闭应用程序并再次打开它,那么您的静态变量可能包含以前的值(如果您没有将变量设置为 null)
【解决方案3】:

您的活动正在恢复。如果你想控制发生的事情,请实现onResume()

详情请见Managing the Activity Lifecycle

编辑:

静态变量是一个 Java 概念。 static 只是表示整个类只有一个变量副本。另一种方法是每个对象都有自己的副本。

因此,当您的代码运行时,您的程序中只有一个变量的副本。它不会保存在任何地方,除非您添加代码来执行此操作。

【讨论】:

  • 我确实阅读了开发人员指南的那部分。不幸的是,他们没有提及静态变量及其“生命周期”。感谢关于 onResume() 的建议。
猜你喜欢
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多