开发者社区> ctrip_xzh> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

保存数据返回后可以继续编辑

简介: <p><span style="font-size:12px">一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. </span></p> <p><span style="font-size:12px">但是当系统内存不足时, 调
+关注继续查看

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

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

Java代码  收藏代码
  1. <span style="font-size: small;">public class MainActivity extends Activity {  
  2.     public static final int SECOND_ACTIVITY = 0;  
  3.     private String temp;  
  4.   
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         // 从savedInstanceState中恢复数据, 如果没有数据需要恢复savedInstanceState为null  
  9.         if (savedInstanceState != null) {  
  10.             temp = savedInstanceState.getString("temp");  
  11.             System.out.println("onCreate: temp = " + temp);  
  12.         }  
  13.     }  
  14.   
  15.     public void onResume() {  
  16.         super.onResume();  
  17.         temp = "xing";  
  18.         System.out.println("onResume: temp = " + temp);  
  19.         // 切换屏幕方向会导致activity的摧毁和重建  
  20.         if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {  
  21.             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  22.             System.out.println("屏幕切换");  
  23.         }  
  24.     }  
  25.       
  26.     // 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法  
  27.     @Override  
  28.     protected void onSaveInstanceState(Bundle outState) {  
  29.         super.onSaveInstanceState(outState);  
  30.         outState.putString("temp", temp);  
  31.     }  
  32. }</span>  

需要注意的是, 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控件的状态, 成员变量的值等.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
NSKeyedArchiver保存对象到本地
NSKeyedArchiver保存对象到本地
0 0
数据的删除与修改
数据的删除与修改
0 0
vbs的字典存入和读取操作 comparemode属性
vbs的字典存入和读取操作 comparemode属性
0 0
以流的方式对文件上传下载,并保存指定位置
以流的方式对文件上传下载,并保存指定位置
0 0
文件中不要保存对象
文件中不要保存对象
0 0
一个“保存”按钮同时存在“增删改”三种操作,该如何去实现?
一般情况下,对表格中的数据进行“增删改”操作,都是直接操作数据库。现在有些项目因为设计或者优化的缘故,不对表格中的数据进行“增删改”,而是通过最后“保存”按钮的操作,一次性将数据传至服务器,由服务器对数据进行“增删改”。 以下通过给用户分配角色这样的功能进行说明。
568 0
保存数据返回后可以继续编辑
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.  但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个a
885 0
修改学生信息窗体——基本数据该从哪里读入
       在学生基本信息查询的下面,有一个修改选中表格中的学生信息的按钮,比如,当选中学号是1,姓名为1.。。这一行中,然后点击下面的修改,就会弹出修改学生信息的窗体。在窗体刚出来时,各个文本框是有数据的,在设计代码时,我刚开始是表格中(也就是学生基本信息查询那个窗体)的数据直接读入修改学生信息的窗体,然后再进行修改等。
653 0
C#中创建、打开、读取、写入、保存Excel的一般性代码
1 Excel对象微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。(1) Application对象。
1033 0
保存的各函数
unit MySys; interface uses Windows, shlObj, Variants, StdCtrls, ComObj, Classes, SysUtils, Controls, Printers, Messages, mmSystem, ComCtrls, UrlMon...
1434 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载