2010-01-22 78 views
2

为了在我的android应用中保持状态,以便用户将返回到他们停止的活动,我在我的清单中设置了非常有用的标志alwaysRetainTaskState:当系统杀死活动时带有全局变量的Android持久状态

<activity android:name=".Main" 
       android:label="@string/app_name" 
       android:alwaysRetainTaskState="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

这样做可以完成工作,或者我想;我发现系统仍然可以销毁应用程序的活动以保留内存,同时保持状态。为了验证这一点,我写了一个小测试应用程序,在循环中创建了一大堆活动,以查看我的应用程序的活动是否会被破坏。系统肯定会破坏我的活动。

随着一些阅读,我发现我需要使用onSaveInstanceState()和onRestoreInstanceState()来帮助维护活动状态。

为了解决我的问题,我们假设我有一个包含多个全局变量的活动,其中一些是静态的,另一些则不是。它们由布尔值,数组列表,字符串等组成。我的问题是,我很困惑哪些变量在活动被破坏时是持久的。哪些应该打包到onSaveInstanceState()中的包中?当一项活动被破坏时,系统是否会对这些变量做任何事情?

回答

5

让我们说我有一个 一些全局变量的活动,一些 他们是静态的,有些则不是。

在Java中没有这样的东西作为“全局变量”。尽可能避免非最终(即可变)的静态数据成员。

哪个应该打包到onSaveInstanceState()中的 包中?

这是不可能在摘要中回答的。

系统是否做任何事情,这些 变量时的活动 破坏?

可能。只要进程存在,静态数据成员就会存活。当你的最后一个活动被销毁时,你的过程将在不久的将来终止,这些静态数据成员将被淘汰。在您的应用程序的下一次运行中,这些静态数据成员将被重新初始化。

+0

是的我不清楚我想要打包到包中。我的意思是说:是否需要保存静态变量?做非静态?从你所说的,当调用saveInstanceState()时,静态成员将不需要保存。当一个活动被销毁时,非静态变量是否会持续存在? – jlim 2010-01-22 16:32:07

+0

对不起 - 我还试图确定什么是确保在我的应用程序中执行的一些用户操作的最佳方式,即向主视图添加动态视图(实际的appWidgets)将被记住,而不管它是什么。我不清楚它是否像保存的实例状态那么简单,或者如果我需要一些其他类型的魔法来保留它们的选择并以某种方式重建它们 – mylock 2010-02-18 07:09:12