学习Activity保存状态的onSaveInstanceState方法

   我发现所谓的高手,就是他能去好好动手思考,不管你学习什么东西,只要你肯去动手,再动动你的脑子,再难的事情也能慢慢解决。学习文档也相当重要,今天学习Activity保存状态的方法onSaveInstanceState(Bundle outState),由文档中Activitys中的Saving activity state有一张状态图可以了解到关于Activity的状态关系

像我英语比较差的人,一个大概意思还是可以看懂的,如果真的看不懂也可以查查翻译软件的翻译慢慢理解。我就讲讲我个人半路出家的看法,第一张图就是一个Activity启动开始如果有另外一个Activity在之前那个Activity之前调用onSaveInstanceState()保存第一个Activity的状态,如果你点击返回键,这个系统就会resumes之前那个Activity。第二张图就好像比较复杂一点,但是一步一步来还是可以理解的,如果有高僧看到,有忍不住讲两句的话,欢迎指点迷津。下面我就写了两个Activity来测试一下这Activity的保存状态变化。

MainActity.java的代码如下:

package com.cooguo.activity;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;


public class MainActivity extends Activity {

private static final  String TAG = "MainActivity";
private static final String CONTENT = "content";
private EditText etx = null;
private Button secondBtn = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        etx = (EditText)findViewById(R.id.ext);
        if(savedInstanceState!=null&&savedInstanceState.containsKey(CONTENT)){
        String cotent = savedInstanceState.getString(CONTENT);
        etx.setText(cotent);
        }
        secondBtn = (Button) findViewById(R.id.second);
        secondBtn.setOnClickListener(listener);
        
        Log.i(TAG, "MainActivity-->onCreate");
    }


    @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
        String content = etx.getText().toString();
        outState.putString(CONTENT, content);
        Log.i(TAG, "MainActivity-->onSaveInstanceState");
}






private OnClickListener listener = new OnClickListener(){


@Override
public void onClick(View view) {
            Button btn = (Button)view;
             Intent itent = new Intent();
            switch (btn.getId()) {
case R.id.second:
itent.setClass(MainActivity.this, SecondActivity.class);
break;
}
            startActivity(itent);
}
   
    };
    
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i(TAG, "MainActivity-->onStart");
}


@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i(TAG, "MainActivity-->OnRestart");
}


@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i(TAG, "MainActivity-->OnResume");
}


@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i(TAG, "MainActivity-->OnPause");

}


@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i(TAG, "MainActivity-->OnStop");
}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(TAG, "MainActivity-->OnDestroy");
}
    
    
}

SecondActivity.java代码:

package com.cooguo.activity;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;


public class SecondActivity extends Activity {


private static final  String TAG = "MainActivity";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        Log.i(TAG, "SecondActivity-->onCreate");
    }


@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i(TAG, "SecondActivity-->onStart");
}


@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i(TAG, "SecondActivity-->OnRestart");
}


@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i(TAG, "SecondActivity-->OnResume");
}


@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i(TAG, "SecondActivity-->OnPause");

}


@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i(TAG, "SecondActivity-->OnStop");
}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(TAG, "SecondActivity-->OnDestroy");
}
}

执行的日志如下:


文档里面有一句这样一句话:

A good way to test your application's ability to restore its state is to simply rotate the device so that the screen orientation changes. When the screen orientation changes, the system destroys and recreates the activity in order to apply alternative resources that might be available for the new orientation. For this reason alone, it's very important that your activity completely restores its state when it is recreated, because users regularly rotate the screen while using applications.

当你屏幕方向改变的时候,系统会destroys和recreates我们的Activity,由于我们在用户改变状态之前,可能用户已经在上面操作了一些动作,所以我们要重新把状态回复出来,这个时候我们就要用onSaveInstanceState方法,因为现在用那自带的测试机不能实现转动所以不能实现出来,但是大体的思路就是这个样子。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值