Android onSaveInstanceState、onRestoreInstanceState保存数据
先看例子:
@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保存数据相关推荐
- Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)
知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...
- Android onSaveInstanceState onRestoreInstanceState
In this tutorial, we'll be discussing the two vital methods for managing the state of the applicatio ...
- Android开发中保存数据的四种方法方法
本文来自:安卓航班网 在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同:以下安卓航班分别列举了Android开发中的不同存储方式的特点. 一,Preferences Pref ...
- android数据写入文件格式,Android 本地文件保存数据(2020-08-07)
文件操作需要手机权限,需要在AndroidManifest.xml添加 --------------------------------第一种方式--------------------------- ...
- Android使用SQLite保存数据
要使用SQLite首先要建表,建表要继承SQLiteOpenHelper,如下: package com.example.sqlitedemo4;import android.content.Cont ...
- 安卓Android sqllite实现保存数据和读数据
1.数据库创建 public class DatabaseHolder extends SQLiteOpenHelper {//创建数据库school.dbpublic DatabaseHolder( ...
- Android doc|Getting Started|部分 --转载 保存数据
保存数据 大多数 Android 应用需要保存数据,即使仅保存在 onPause() 过程中与应用状态有关的信息,以便用户进度不会丢失 . 大多数非平凡应用也需要保存用户设置,并且有些应用必须在文件和 ...
- android回收内存保存变量,android基础之onSaveInstanceState用法(一)保存容易被回收的自定义类的静态全局变量...
当切换到其它apk时且内存不足时,在之前设置的单例模式静态变量会被回收掉.解决方法要么定义为Applicantion全局变量,要么在onSaveInstanceState中保存 @Override p ...
- Android中突发情况数据的保存
Android中突发情况数据的保存 本文原创,转载请获得本人准许. 写在前面: 在我们的APP使用的过程中,总有可能出现各种手滑.被压在后台.甚至突然被杀死的情况.所以对APP中一些临时数据或关键持久 ...
最新文章
- 开源交互式自动标注工具EISeg
- c++ 预处理命令 #undef用法
- Linux_基于Docker搭建Redis集群
- JAVA面向对象OOP多态→抽象类abstract、接口interface实现implement、final不变修饰符、样例代码
- Nginx中的upstream轮询机制介绍
- 数据安全风险分析及应对策略研究
- 2203-python跳转,窗口图标,提示框,消息盒子
- UE4 蓝图接口 BluePrint Interface
- 培训php暑期,西安软件php暑假培训
- 8000字干货:那些很厉害的人是怎么构建知识体系的
- 办公室桌面计算机,我的办公室桌面(一切为了简洁)
- elementUI表格自动刷新
- 超全!我常用的 70 个数据分析网址
- 什么专业可以免考计算机二级,关于自考免考:2020年计算机二级证书可以免考哪些科目?...
- Android FFmpeg视频播放器三 音频封装格式解码播放
- 念数字python_念数字解题
- 一种惯导/北斗组合导航的半实物仿真测试方法ETest
- 网吧软件限制的小技巧
- 理想职业计算机程序英语作文,理想职业英文作文120词左右,作为演讲用,要求演讲2到3分钟....
- 爱尔兰塔拉理工学院计算机,爱尔兰塔拉理工学院代表来访我校