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

一般来说, 调用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控件的状态, 成员变量的值等.

时间: 2024-08-02 14:33:47

保存数据返回后可以继续编辑的相关文章

window.open()打开页面,这个页面添加操作后保存数据,父页面DropDownList控件重新绑定新的数据显示出来?

问题描述 父页面用javascriptwindow.open方法打开子页面后,进行添加操作后保存数据关闭后,父页面的DropDownList控件重新绑定新编辑的数据!怎么做,有什么好办法!谢谢大家 解决方案 解决方案二:在关闭子页面后刷新父页面,同时父页面访问数据库进行绑定.解决方案三:对,关闭子界面刷新父界面,http://topic.csdn.net/u/20071031/17/d3615d78-9dff-4562-b8ec-adf7d3b46fbb.html?seed=1876618157

jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据_jquery

废话不多说了,直接给大家贴代码了. 关键代码如下所示: /// 最近一次使用编辑行 一切正常 ///<summary> ///初始化数据容器 ///</summary> function InitGrid(){ var lastIndex; $("#grid").datagrid({ url:'', loadMsg:'数据加载中,请稍后......', border:false, fitColumns:true, remoteSort:false, onDblC

如何上传Excel直接读取里面的数据,不用保存excel文件后再读取

问题描述 HttpPostedFileBasemypostfile=Request.Files[0];stringmyfile=MyPathEx.myfileName(@"事业单位准考证上传");myfile=myfile+".xlsx";myfile=MyPathEx.saveFile(mypostfile,Server,@"/ImportFile/",myfile);//保存上载文件的内容,并返回上传的路径+文件名ExamineeOp_1.S

mui 页面跳转后加载数据,返回后的页面刷新,这是手机app

问题描述 mui 页面跳转后加载数据,返回后的页面刷新,这是手机app 我在A页面用mui中的openwindow 打开B页面,在B页面添加数据至后台,点返回按钮,回到A页面,我要这时在A页面自动刷新出B页面添加的数据..这个怎么操作..各位大神,急急急!!求赐教 解决方案 我这么说,你的A页面是当前页面,你的B页面是你后打开的页面,然后你的B页面的数据要返回给A页面用来展示.好,下面进入.... 如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用Activity

数据加载后保存数据到另外数据表中急急急急急急急急急急急急急急

问题描述 数据加载后保存数据到另外数据表中急急急急急急急急急急急急急急 datagrid容器 数据加载后保存到另一个数据库表 sqlite数据库中加载一组数据到datagrid中. 现在把数据保存到sql server 数据库中. 解决方案 Dim Con As New ADODB.Connection '定义ADO对象 Dim rs As New ADODB.Recordset Con.ConnectionString = "driver=SQL Server;server=192.168.1

数据显示-如何将串口接收到的数据返回给主线程并显示在编辑框中?

问题描述 如何将串口接收到的数据返回给主线程并显示在编辑框中? 小弟用的是serialPort,MFC,怎么才能把串口接收到的数据返回给主线程显示在编辑框中?求大侠帮助! void CRBAS_ODBCView::OnButtonSurveyStart() { /**************发数据*********************************/ SerialPort^ _serialPort = gcnew SerialPort("COM3", 38400, Par

jquery ajax php保存数据并返回值

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-

一个文本框,当输入一些字符后,通过ajax+jquery会从后台查到一些数据,当数据返回到页面上时,需要将文本框变成下拉框,下拉框中显示返回的数据,该怎么实现

问题描述 一个文本框,当输入一些字符后,通过ajax+jquery会从后台查到一些数据,当数据返回到页面上时,需要将文本框变成下拉框,下拉框中显示返回的数据,现在能得到数据,就是不知道怎么将原来的文本框变成下拉框 解决方案 解决方案二:做两个控件,根据情况隐藏一个,表示一个.document.getElementById("xxx").style.display="";//表示document.getElementById("xxx").styl

文件读取-c语言,用fgets将文件的数据读取后,如何对返回的数据进行操作,例如排序

问题描述 c语言,用fgets将文件的数据读取后,如何对返回的数据进行操作,例如排序 代码如下,我做法是 将fgets(readline, N, fp) 返回的readline 用atoi函数转为整型后赋给数组list,然后对list数组中的数据进行排序. 但实际运行下来,没有得到想要的结果,从printf结果看,atoi函数未能将readline 中的值转为整型,请各位大虾不吝指教,如何才能拿到fgets返回的readline的值,然后进行排序? #define N 256 #define S