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

Posted wx5aae83353cec4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存数据返回后可以继续编辑相关的知识,希望对你有一定的参考价值。


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

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



    1. <span style="font-size: small;">public class MainActivity extends
    2. public static final int SECOND_ACTIVITY = 0;
    3. private
    4.
    5. @Override
    6. public void
    7. super.onCreate(savedInstanceState);
    8. // 从savedInstanceState中恢复数据, 如果没有数据需要恢复savedInstanceState为null
    9. if (savedInstanceState != null)
    10. "temp");
    11. "onCreate: temp = "
    12.
    13.
    14.
    15. public void
    16. super.onResume();
    17. "xing";
    18. "onResume: temp = "
    19. // 切换屏幕方向会导致activity的摧毁和重建
    20. if
    21. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    22. "屏幕切换");
    23.
    24.
    25.
    26. // 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法
    27. @Override
    28. protected void
    29. super.onSaveInstanceState(outState);
    30. "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控件的状态, 成员变量的值等.

    以上是关于保存数据返回后可以继续编辑的主要内容,如果未能解决你的问题,请参考以下文章

    如何保存为新文件并继续处理Vim中的原始文件?

    编辑后不刷新 ALV。为啥?

    用navicat打开数据库表里有BLOB的数据,可以保存成XLS编辑

    Vi编辑的shell脚本如何执行啊?

    php执行shell不阻塞方法

    vim 退出命令(保存放弃保存)