Android基础知识之四大组件Activity(四)保存Activity的状态

        有时候,在我们使用Application的时候可能会遇到因横竖屏切换,或者系统回收内存等意外状况而销毁掉Activity,而再次创建,这时我们会发现,之前Activity的状态没有被保存下来,遇到这种情况应该怎么处理囊?

        答案我们在Android的API文档中找到了,抓去重要的一段:在遇到意外情况销毁掉Activity之前,系统会执行一个onSaveInstanceState()方法,调用时系统会传入一个Bundle对象, 你可以利用 putString() 之类的方法,以键值对的方式来把activity状态信息保存到该Bundle对象中。 然后,如果系统杀掉了你的application进程并且用户又返回到你的activity,系统就会重建activity并将这个 Bundle 传入onCreate() 和onRestoreInstanceState() 中,你就可以从 Bundle 中解析出已保存信息并恢复activity状态。如果没有储存状态信息,那么传入的 Bundle 将为null,与Activity第一次创建相同。

PS:activity被销毁之前,并不是每次都会调用 onSaveInstanceState() ,因为存在不必保存状态的情况(如用户按BACK键关闭掉了activity)。 如果系统要调用 onSaveInstanceState() 方法,那么它通常会在 onStop() 方法之前并且可能是在 onPause() 之前调用。

点击查看API→http://wear.techbrood.com/guide/components/activities.html


我们来创建一个Demo测试一下。

首先创建项目,在MainActivity中这样写:

package com.daxiangzai.androiddemo.savingactivitystate;

import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends ActionBarActivity {

    private String TAG = "TAG";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //若savedInstanceState不为空,获取值并输入日志
        if(savedInstanceState!=null){
            Log.i(TAG, savedInstanceState.getString("onCreate"));
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        //若savedInstanceState不为空,获取值并输入日志
        if(savedInstanceState!=null){
            Log.i(TAG, savedInstanceState.getString("onRestoreInstanceState"));
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState");
        //存储值到Bundle对象中
        outState.putString("onCreate", "Restore the activity state in onCreate method");
        outState.putString("onRestoreInstanceState", "Restore the activity state in onRestoreInstanceState method");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause");
    }

}
注意:这里还有另外一个方法(重载的方法):

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }
方法名一样,但参数不同。不要将两个方法混淆哦!

之后我们运行程序,进行一个横竖屏切换动作,我们会发现Logcat会出现下列信息:


由此可见,此实例的onSaveInstanceState()方法onPause()方法之后进行的(不是一定都在onPause()方法之后执行),在Activity被重新创建的时候,onCreate()方法与onRestoreInstanceState()方法均能获得Bundle对象。


资源代码:http://download.csdn.net/detail/lxawcf/8957153

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值