天天看点

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

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

但是当系统内存不足时, 调用onpause()和onstop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onsaveinstancestate()方法. onsaveinstancestate()方法接受一个bundle类型的参数, 开发者可以将状态数据存储到这个bundle对象中,

这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的oncreate()方法时, 上述的bundle对象会作为实参传递给oncreate()方法, 开发者可以从bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.

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

<span style="font-size: small;">public class mainactivity extends activity {  

    public static final int second_activity = 0;  

    private string temp;  

    @override  

    public void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        // 从savedinstancestate中恢复数据, 如果没有数据需要恢复savedinstancestate为null  

        if (savedinstancestate != null) {  

            temp = savedinstancestate.getstring("temp");  

            system.out.println("oncreate: temp = " + temp);  

        }  

    }  

    public void onresume() {  

        super.onresume();  

        temp = "xing";  

        system.out.println("onresume: temp = " + temp);  

        // 切换屏幕方向会导致activity的摧毁和重建  

        if (getrequestedorientation() == activityinfo.screen_orientation_unspecified) {  

            setrequestedorientation(activityinfo.screen_orientation_landscape);  

            system.out.println("屏幕切换");  

    // 将数据保存到outstate对象中, 该对象会在重建activity时传递给oncreate方法  

    protected void onsaveinstancestate(bundle outstate) {  

        super.onsaveinstancestate(outstate);  

        outstate.putstring("temp", temp);  

}</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控件的状态, 成员变量的值等.

上一篇: aFinal框架

继续阅读