【问题标题】:Is it normal that static member values are retained when an application is destroyed?销毁应用程序时保留静态成员值是否正常?
【发布时间】:2012-01-04 16:24:51
【问题描述】:

没想到,我的静态类成员在应用程序完成后被保留 (在 onDestroy() 被调用之后)。 静态成员初始化在下一个应用程序实例化中被忽略。 这是正常的还是只是模拟器中的错误? 我在文档中找不到任何关于它的信息。他们是否指定了与此行为相关的任何内容?

其他 cmets: 当我有两个活动字段时,静态和非静态如下:

static String s1 = new String("s1");
String s2 = new String("s2");

...销毁并再次启动应用程序,第一个初始化程序不执行,第二个初始化程序被执行。意义在哪里?对我来说,它违反了语言规则。

【问题讨论】:

    标签: java android static-members


    【解决方案1】:

    onDestroy 并不意味着应用程序的进程被杀死,或者类本身被销毁/卸载,它正在销毁一个活动instance。

    【讨论】:

    • 那么答案是什么?应用程序被更新杀死?长生不老?
    • 隐含的答案是您对 onDestroy 的假设是不正确的,并且您提出了错误的问题。您实际上是在询问何时完全删除应用程序(如强制停止)?
    • 顺便说一句:考虑到 Activity 的非静态成员的初始化程序在应用程序重新启动时再次执行,我们肯定知道构造了新的 Activity 类实例 - 所以你的答案不正确。应用程序未冻结。它只保留静态成员。
    • @ardabro 我从来没有说过被“冻结”——我们正在讨论类加载,即初始化静态成员时,与实例属性初始化无关——确切地说是你接受的回答也说明了。事实上,你问错了问题——你想知道何时重新加载应用程序,触发类重新加载,也就是运行静态初始化程序的时间;也是我说的。
    • 我认为@ardabro 您混淆了什么是静态属性,以及 Android 应用程序上下文中 Java 类的生命周期。我不是 Android 开发人员,但根据 Dave Newton 的说法,当您关闭应用程序时,似乎会调用 onDestroy() 并销毁实例。当您重新启动应用程序时,会创建一个新实例。类的静态元素没有被卸载,因为重启应用时使用的是同一个虚拟机。
    【解决方案2】:

    当一个应用程序启动时,它自己的虚拟机就启动了,主Activity也启动了。当该活动离开时(例如,按下后退按钮或您调用完成())onDestroy()被执行。

    虽然这在技术上结束了您的应用程序,但您的应用程序进程和虚拟机仍在运行。这包括正在运行的线程。

    所以所有静态成员都保持不变。系统可以在虚拟机不显示的情况下随时杀死需要更多内存的虚拟机。

    【讨论】:

    • 好的,所以我看到静态成员初始化是无用的,所有可以改变的东西都必须在代码的开头分配。
    • @ardabro 静态属性不是无用的,但应该用于它们的特定目的。它们通常在 Java 应用程序中用于存储常量(通常使用 final 关键字强制使其不可变),但它们在其他场景中也很有用,例如值在类的实例之间是通用且一致的。跨度>
    • 绝对不是没用——只是 Android 应用的生命周期与典型的 Java 应用不同,后者的启动/关闭受到更明确的控制。
    • 我并不是说静态属性没用。无用的是可以在应用程序期间更改的成员的静态初始化。
    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多