Android onSaveInstanceState、onRestoreInstanceState保存数据

先看例子:

    @Override
    protected 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();
    }

    @Override
    protected 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值