【发布时间】: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