`
coolxing
  • 浏览: 874192 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:97288
社区版块
存档分类
最新评论

android笔记--保存和恢复activity的状态数据

阅读更多

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]


一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 

但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.

public class MainActivity extends Activity {
	public static final int SECOND_ACTIVITY = 0;
	private String temp;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 从savedInstanceState中恢复数据, 如果没有数据需要恢复savedInstanceState为null
		if (savedInstanceState != null) {
			temp = savedInstanceState.getString("temp");
			System.out.println("onCreate: temp = " + temp);
		}
	}

	public void onResume() {
		super.onResume();
		temp = "xing";
		System.out.println("onResume: temp = " + temp);
		// 切换屏幕方向会导致activity的摧毁和重建
		if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
			System.out.println("屏幕切换");
		}
	}
	
	// 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putString("temp", temp);
	}
}

需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前. 


onSaveInstanceState()方法的默认实现

如果开发者没有覆写onSaveInstanceState()方法, 此方法的默认实现会自动保存activity中的某些状态数据, 比如activity中各种UI控件的状态. android应用框架中定义的几乎所有UI控件都恰当的实现了onSaveInstanceState()方法, 因此当activity被摧毁和重建时, 这些UI控件会自动保存和恢复状态数据. 比如EditText控件会自动保存和恢复输入的数据, 而CheckBox控件会自动保存和恢复选中状态. 开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可), 剩余的事情就可以自动完成了. 如果没有为控件指定ID, 则这个控件就不会进行自动的数据保存和恢复操作.

由上所述, 如果开发者需要覆写onSaveInstanceState()方法, 一般会在第一行代码中调用该方法的默认实现: super.onSaveInstanceState(outState).


是否需要覆写onSaveInstanceState()方法

既然该方法的默认实现可以自动的保存UI控件的状态数据, 那什么时候需要覆写该方法呢?

如果需要保存额外的数据时, 就需要覆写onSaveInstanceState()方法. 如需要保存类中成员变量的值(见上例).


onSaveInstanceState()方法适合保存什么数据

由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等.


引发activity摧毁和重建的其他情形

除了系统处于内存不足的原因会摧毁activity之外, 某些系统设置的改变也会导致activity的摧毁和重建. 例如改变屏幕方向(见上例), 改变设备语言设定, 键盘弹出等.

3
0
分享到:
评论
2 楼 avi9111 2012-10-28  
该顶 , 该顶
1 楼 Jefry 2011-11-28  
我想你致敬

相关推荐

    Android笔记(3)---Activity和Intent

    开发者需要根据这些阶段来管理Activity的状态,例如保存和恢复数据,释放资源等。 Intent则是一种消息传递对象,用于在Android组件之间进行通信,特别是Activity之间。Intent有两种类型:显式Intent和隐式Intent。...

    Android学习笔记-Activity篇

    2. 保存activity状态:当Activity被系统销毁并需要恢复时,可以使用`onSaveInstanceState()`来保存临时数据,而持久化数据应存储在`SharedPreferences`, 文件系统或数据库中。 3. 处理配置文件的改变:当设备配置如...

    Android自学笔记-15-Activity的生命周期

    在本篇自学笔记中,我们将深入探讨Activity如何启动、运行、暂停、恢复以及销毁,以及在这些状态之间转换时应如何适当地管理资源。 首先,Activity的生命周期主要由七个关键回调方法组成: 1. **onCreate()**: 当...

    Android笔记(5)---Activity生命周期

    在这个阶段,应该保存用户的数据和状态,因为Activity可能会被销毁。 5. onStop():当Activity完全不可见时调用,例如被新的Activity覆盖。此时,Activity不再占用内存资源,适合释放大量内存。 6. onDestroy():...

    Android开发笔记(3)-Activity生命周期

    除了上述主要方法,还有其他辅助方法,如**onSaveInstanceState(Bundle outState)**,用于在Activity被销毁前保存临时状态,以便恢复时使用;**onRestoreInstanceState(Bundle savedInstanceState)** 在Activity重建...

    新版Android开发教程;笔记--基础入门二

    教程会深入讲解Activity的生命周期,包括onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等方法,以及如何在不同状态间进行状态保存和恢复。 四、意图(Intent)与数据传递 Intent是Android...

    Android笔记

    根据给定的文件信息,以下是对“Android笔记”的知识点整理与详细解释: ### Android学习笔记概览 #### 一、基础概念 1. **开篇介绍:** - 开始学习Android开发之前的基础介绍。 2. **框架简介:** - 对Android...

    Android学习笔记(5-13)

    总的来说,这份笔记覆盖了Android开发的多个核心方面,从基础的UI设计和数据管理到网络通信和组件交互,对于想要系统学习Android开发的读者来说,是一份非常有价值的资源。通过学习这些章节,读者不仅可以构建自己的...

    Android基础学习笔记

    - **Bundle**: 用于在Intent或保存/恢复状态时传递数据,键值对形式。 14. **文件下载**: - 使用HttpURLConnection打开连接,获取InputStream,下载文件。 - 需要`android.permission.INTERNET`权限访问网络,`...

    Android开发教程笔记完全版(第11-13篇)[完结]

    - Android应用生命周期:详解各个Activity状态和生命周期方法,如onCreate(), onStart(), onResume(), onPause(), onStop()和onDestroy(),以及如何妥善处理应用的暂停和恢复。 - 资源管理:学习如何使用Android...

    android 艺术开发探索 读书笔记(1-3章)

    - 使用 `onSaveInstanceState()` 方法保存Activity的状态数据到`Bundle`对象中。 - 在Activity重新创建时,可以通过 `onRestoreInstanceState()` 方法恢复之前保存的数据。 4. **配置更改**: - 为了防止...

    Android学习笔记1

    10. EditText内容的保存恢复:在应用状态变化,如屏幕旋转或者Activity被系统回收时,需要保存和恢复用户输入的数据。 11. Linelayout布局:涉及到布局管理器的使用,特别是使用Linlayout来实现垂直和水平的布局。...

    android生命周期管理:重启或停止一个Activity

    当用户返回到已停止的Activity,系统会依次调用onRestart()、onStart()和onResume()方法,恢复Activity的状态。在onRestart()中,你可以做一些预准备工作,如初始化UI元素;在onStart()中,Activity变得对用户可见,...

    Android的activity学习笔记

    【Android的Activity学习笔记】 Activity在Android开发中扮演着至关重要的角色,它是应用程序的基本功能单元,主要用于构建用户界面和处理用户交互。Activity本身并不具备界面元素,而是通过`setContentView(View)`...

    Android零基础开发教程笔记.doc

    开发者需要理解何时以及如何在不同状态下保存和恢复应用程序的状态。另外,还会介绍如何进行单元测试和集成测试,以确保代码的质量和稳定性。 高级概念可能包括多线程处理、网络编程、数据同步、蓝牙通信、推送通知...

    android笔记

    - `onPause()`: 当系统准备切换到另一个Activity时调用,用于保存数据和停止资源消耗大的操作,应尽快完成。 - `onStop()`: 当活动完全不可见时调用,可能被其他活动覆盖或用户离开应用。 - `onDestroy()`: 活动...

    Android开发笔记

    当Activity重新创建时,可以在`onCreate`方法中恢复之前保存的状态。 ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout....

    Android学习笔记(三七):再谈屏幕切换.doc

    总结来说,Android应用在处理屏幕旋转时,必须考虑数据的保存与恢复,以确保用户界面和应用状态的一致性。同时,通过配置Activity的屏幕方向属性,可以控制是否允许屏幕切换,从而优化特定场景下的用户体验。了解...

Global site tag (gtag.js) - Google Analytics