先看例子:

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.exercise_clone);if (null != savedInstanceState) {String json = savedInstanceState.getString("homeworkDetail");List<HomeworkDetail> details = JSON.parseArray(json, HomeworkDetail.class);if (details != null) {arrayList.addAll(details);}}initWedget();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);if (arrayList != null) {String json = JSON.toJSONString(arrayList);outState.putString("homeworkDetail", json);}}

一般的,当Android activity的生命周期进入onPause后,Android系统紧接着就要回调:

protected void onSaveInstanceState(Bundle outState);  

因此,通常,Android activity保存现场数据至少其中两个思路和方法是:

(1)可以在onPause保存现场数据;
(2)也可以在onSaveInstanceState中保存现场数据。


然后到了后面,当activity再次onResume时候恢复出过去发生的现场数据。
(注意!Android保存现场数据的方法和思路很多,上面只是给出其中两个最基本、最简单的思路和方法。)

需要注意的一点是,有一种情况,Android系统是不会调用activity的onSaveInstanceState方法:当用户按了返回键(back键)退出这个activity时。之所以这么设计,我谨慎估计Android的系统设计思想认为:既然用户已经选择完全退出这个activity,那就没有必要保存现场数据了。
Android的activity既然有onSaveInstanceState(),那么,与之对应的onRestoreInstanceState(),在Android
activity生命周期的什么时候被Android系统回调呢?答案是:和onSaveInstanceState一样,onRestoreInstanceState并不是Android
activity生命周期中的一部分。两者只是在Android activity生命周期发生过程中,Android系统参与进来的回调和过程。

如果要恢复activity的现场数据,虽然onRestoreInstanceState的方法名字看上去挺像回事,但实际上onRestoreInstanceState通常并不被开发者用来做“Restore”数据。然而,要明白的是,至少有一种情况发生时候,Android的onRestoreInstanceState将被系统回调:当activity被销毁(onDestroy)然后又重新加载这个activity时,在onStart之后还没有onResume时候将调用onRestoreInstanceState。听上去很奇怪,既然销毁了,怎么又加载这个activity呢?这种情况的场景在哪儿?比如,当activity在横竖屏切换时候,这种情况的场景就要发生,Android在横竖排切换时候,将主动销毁activity和重新创建一个新的activity出来,在此过程中,onRestoreInstanceState就要被回调。

这样的描述有些过于抽象,写实例代码检验一下就清楚了。
我写一个最简单的Android activity,这个activity没有任何内容,只是重写了Android activity的各个生命周期中的方法,目的是追踪activity在生命周期中各个方法的回调动作。保存一个系统时间戳(System.currentTimeMillis)作为标记,测试的Activity全部代码如下:

package zhangphil.lifecycle;  import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;  public class MainActivity extends Activity {  private final String TAG = "zhangphil";  private final String SAVED_DATA = "saved_data";  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  // 判断Android当前屏幕是横屏还是竖屏。  if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  Log.d(TAG, "竖屏");  } else {  Log.d(TAG, "横屏");  }  Log.d(TAG, "onCreate");  }  @Override  protected void onStart() {  super.onStart();  Log.d(TAG, "onStart");  }  @Override  protected void onRestart() {  super.onRestart();  Log.d(TAG, "onRestart");  }  @Override  protected void onResume() {  super.onResume();  Log.d(TAG, "onResume");  }  @Override  protected void onPause() {  super.onPause();  Log.d(TAG, "onPause");  }  @Override  protected void onStop() {  super.onStop();  Log.d(TAG, "onStop");  }  @Override  protected void onDestroy() {  super.onDestroy();  Log.d(TAG, "onDestory");  }  @Override  protected void onSaveInstanceState(Bundle outState) {  super.onSaveInstanceState(outState);  long time = System.currentTimeMillis();  outState.putLong(SAVED_DATA, time);  Log.d(TAG, "onSaveInstanceState -> 保存数据:" + time);  }  @Override  protected void onRestoreInstanceState(Bundle savedInstanceState) {  super.onRestoreInstanceState(savedInstanceState);  long time = savedInstanceState.getLong(SAVED_DATA, -1);  Log.d(TAG, "onRestoreInstanceState -> 恢复数据:" + time);  }
}  

运行这个Activity,然后旋转机身从竖直方向变为水平方向,把这个activity从从标准竖屏切换到横屏,Logcat追踪打印的结果输出说明了一切,如图:

转自http://blog.csdn.net/zhangphil/article/details/48155371

Android onSaveInstanceState、onRestoreInstanceState保存数据相关推荐

  1. Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

    知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...

  2. Android onSaveInstanceState onRestoreInstanceState

    In this tutorial, we'll be discussing the two vital methods for managing the state of the applicatio ...

  3. Android开发中保存数据的四种方法方法

    本文来自:安卓航班网 在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同:以下安卓航班分别列举了Android开发中的不同存储方式的特点. 一,Preferences Pref ...

  4. android数据写入文件格式,Android 本地文件保存数据(2020-08-07)

    文件操作需要手机权限,需要在AndroidManifest.xml添加 --------------------------------第一种方式--------------------------- ...

  5. Android使用SQLite保存数据

    要使用SQLite首先要建表,建表要继承SQLiteOpenHelper,如下: package com.example.sqlitedemo4;import android.content.Cont ...

  6. 安卓Android sqllite实现保存数据和读数据

    1.数据库创建 public class DatabaseHolder extends SQLiteOpenHelper {//创建数据库school.dbpublic DatabaseHolder( ...

  7. Android doc|Getting Started|部分 --转载 保存数据

    保存数据 大多数 Android 应用需要保存数据,即使仅保存在 onPause() 过程中与应用状态有关的信息,以便用户进度不会丢失 . 大多数非平凡应用也需要保存用户设置,并且有些应用必须在文件和 ...

  8. android回收内存保存变量,android基础之onSaveInstanceState用法(一)保存容易被回收的自定义类的静态全局变量...

    当切换到其它apk时且内存不足时,在之前设置的单例模式静态变量会被回收掉.解决方法要么定义为Applicantion全局变量,要么在onSaveInstanceState中保存 @Override p ...

  9. Android中突发情况数据的保存

    Android中突发情况数据的保存 本文原创,转载请获得本人准许. 写在前面: 在我们的APP使用的过程中,总有可能出现各种手滑.被压在后台.甚至突然被杀死的情况.所以对APP中一些临时数据或关键持久 ...

最新文章

  1. 开源交互式自动标注工具EISeg
  2. c++ 预处理命令 #undef用法
  3. Linux_基于Docker搭建Redis集群
  4. JAVA面向对象OOP多态→抽象类abstract、接口interface实现implement、final不变修饰符、样例代码
  5. Nginx中的upstream轮询机制介绍
  6. 数据安全风险分析及应对策略研究
  7. 2203-python跳转,窗口图标,提示框,消息盒子
  8. UE4 蓝图接口 BluePrint Interface
  9. 培训php暑期,西安软件php暑假培训
  10. 8000字干货:那些很厉害的人是怎么构建知识体系的
  11. 办公室桌面计算机,我的办公室桌面(一切为了简洁)
  12. elementUI表格自动刷新
  13. 超全!我常用的 70 个数据分析网址
  14. 什么专业可以免考计算机二级,关于自考免考:2020年计算机二级证书可以免考哪些科目?...
  15. Android FFmpeg视频播放器三 音频封装格式解码播放
  16. 念数字python_念数字解题
  17. 一种惯导/北斗组合导航的半实物仿真测试方法ETest
  18. 网吧软件限制的小技巧
  19. 理想职业计算机程序英语作文,理想职业英文作文120词左右,作为演讲用,要求演讲2到3分钟....
  20. 爱尔兰塔拉理工学院计算机,爱尔兰塔拉理工学院代表来访我校

热门文章

  1. 手写的奇怪vector
  2. Windows Server 2008 R2忘记密码导致无法修改密码
  3. 编程语言的分类及其优缺点,Python标准输入与输出
  4. (十一)Json文件配置
  5. 说说云盘背后的黑科技!
  6. 8、JavaScript深入浅出——数据类型
  7. 我新买的红米手机,新浪和360浏览器都能进,也能看电视,就是不能上手机QQ和微信...
  8. 遇到一个sql2000的问题,实在搞不懂了,求解决的办法?
  9. Java Web学习(五)session、cookie、token
  10. Android开发 ShapeDrawable详解