Android中Activity状态的保存和恢复:onSaveInstanceState和onRestoreInstanceState方法
2015-07-13 21:24
573 查看
转自 http://blog.csdn.net/lixiang0522/article/details/7565401
先看图:
Android中的activity通过onSaveInstanceState()方法保存activity的状态,在onCreate或者onRestoreInstanceState方法恢复状态,如果是通过onRestart方法前端运行的话,只会执行onSaveinstanceState方法。直接看代码:
[java] view
plaincopy
package com.hebaijun.savestate;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class SaveStateActivity extends Activity {
public static final String TAG = "SaveStateActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState!=null) {
Log.v(TAG, savedInstanceState.getString("data"));
}
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v(TAG, "onCreate");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.v(TAG, savedInstanceState.getString("data"));
super.onRestoreInstanceState(savedInstanceState);
Log.v(TAG, "onRestoreInstanceState");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("data", "example");
super.onSaveInstanceState(outState);
Log.v(TAG, "onSaveInstanceState");
}
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "onPause");
}
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "onResume");
}
@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.v(TAG, "onRestart");
}
}
main.xml
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</EditText>
</LinearLayout>
1.运行程序后我们按HOME键,然后我们重新进入程序,Log如图:
我们可以看出onSaveInstanceState方法在onPause方法前执行。
程序恢复执行的时候调用了onRestart方法,并没有调用 onRestoreInstanceState方法。
2.运行程序后按BACK键,Log如图:
程序并没有调用onSaveInstanceState方法,因为按BACK键表明用户已经明确退出,所以不会执行保存状态的操作。就是说 onSaveInstanceState能不能被执行到是不确定的,要保存永久的数据话还是在onPause方法中用其他方式保存。
如果在edittext中输入字符的话,重新执行也不会重新出现。
3.运行程序,在EditText中输入字符串,切换横竖屏。Log如图:
运行界面没有截图,但是可以看到,EditText中的字符有保存下来,说明UI是自动保存和恢复的。前提是这个View要赋给id: android:id="@+id/editText1"
onRestoreInstanceState方法在onStart后面onResume前面执行。
可以附加其他你想保存的状态,在 onCreate或者onRestoreInstanceState方法中都可以恢复。
先看图:
Android中的activity通过onSaveInstanceState()方法保存activity的状态,在onCreate或者onRestoreInstanceState方法恢复状态,如果是通过onRestart方法前端运行的话,只会执行onSaveinstanceState方法。直接看代码:
[java] view
plaincopy
package com.hebaijun.savestate;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class SaveStateActivity extends Activity {
public static final String TAG = "SaveStateActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState!=null) {
Log.v(TAG, savedInstanceState.getString("data"));
}
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v(TAG, "onCreate");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.v(TAG, savedInstanceState.getString("data"));
super.onRestoreInstanceState(savedInstanceState);
Log.v(TAG, "onRestoreInstanceState");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("data", "example");
super.onSaveInstanceState(outState);
Log.v(TAG, "onSaveInstanceState");
}
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "onPause");
}
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "onResume");
}
@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.v(TAG, "onRestart");
}
}
main.xml
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</EditText>
</LinearLayout>
1.运行程序后我们按HOME键,然后我们重新进入程序,Log如图:
我们可以看出onSaveInstanceState方法在onPause方法前执行。
程序恢复执行的时候调用了onRestart方法,并没有调用 onRestoreInstanceState方法。
2.运行程序后按BACK键,Log如图:
程序并没有调用onSaveInstanceState方法,因为按BACK键表明用户已经明确退出,所以不会执行保存状态的操作。就是说 onSaveInstanceState能不能被执行到是不确定的,要保存永久的数据话还是在onPause方法中用其他方式保存。
如果在edittext中输入字符的话,重新执行也不会重新出现。
3.运行程序,在EditText中输入字符串,切换横竖屏。Log如图:
运行界面没有截图,但是可以看到,EditText中的字符有保存下来,说明UI是自动保存和恢复的。前提是这个View要赋给id: android:id="@+id/editText1"
onRestoreInstanceState方法在onStart后面onResume前面执行。
可以附加其他你想保存的状态,在 onCreate或者onRestoreInstanceState方法中都可以恢复。
相关文章推荐
- Android短彩信收件人的实现
- Android AOSP输入法(LatinIME)输入流程二
- 【转】【Android开发经验】Android相关好博客推荐--跟随大神的脚步才能成为大神--加油!
- Android中目的地Intent的使用
- Android 运行程序报错:Unable to execute dex: Multiple dex files define Lcom/baidu/android/pushservice/Push
- Android 事件分发实践(一),解决ScrollView嵌套ListView滑动的问题
- No resource found that matches the given name 'android:Widget.Material.ActionButton'的原因及解决方法
- Android学习笔记之图片轮播...
- Windows环境下Android Studio v1.0安装教程
- Android自定义浏览器选择本地文件上传问题
- Android Touch事件的分发过程
- android小错误:Failure retrieving text 0x7f050001 in package
- android的wake_lock介绍
- windows下编译Android版本的boost库文件
- Android 开源框架ImageLoader基本介绍及使用
- Android之——Fragment生命周期(日志截图版)
- OSChina客户端源码学习(1)--Android与Server的交互
- android paint的抗锯齿效果
- Android破解之Lic文件加密程序(首例)
- Android early suspend/late resume