`

【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析

 
阅读更多

作者 : 韩曙亮

转载请著名出处 :http://blog.csdn.net/shulianghan/article/details/38297083



一. 相关方法简介



1. 状态保存方法示例


package com.example.octopus_saveinstance;

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

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
	}
	
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
	}
	
}


2. 相关方法介绍



(1) onCreate(Bundle savedInstanceState) 方法


Activity 创建时回调 : 该方法会自动传入一个 Bundle 对象, 该 Bundle 对象就是上次被系统销毁时在onSaveInstanceState 或者onRestoreInstanceState 中保存的数据;

-- 注意 : 只有是系统自动回收的时候才会保存 Bundle 对象数据;

-- Bundle 对象来源 : onCreate() 方法中的 Bundle 对象参数, 是在 onSaveInstance() 或者 onRestoreInstanceState() 方法中保存的 Bundle 对象;

.



(2)onSaveInstanceState(Bundle outState) 方法


outState 参数作用 :

-- 数据保存 : Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中;

-- 恢复数据 : 在 Activity 的 onCreate()方法 创建 Activity 的时候会传入一个 Bundle 对象, 这个 Bundle 对象就是这个 outState 参数;


调用时机 : Activity 容易被销毁的时候调用, 注意是容易被销毁, 也可能没有销毁就调用了;

-- 按下Home键: Activity 进入了后台, 此时会调用该方法;

-- 按下电源键 : 屏幕关闭, Activity 进入后台;

-- 启动其它 Activity : Activity 被压入了任务栈的栈底;

-- 横竖屏切换 : 会销毁当前 Activity 并重新创建;


onSaveInstanceState方法调用注意事项 :

-- 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;

-- 调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;

-- 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存;

-- 关于默认的super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;



(3)onRestoreInstanceState(Bundle savedInstanceState) 方法


方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;

-- Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;

-- 位于生命周期位置吧 : 该方法在 onResume() 方法之前保存信息;



二 代码示例


Activity 主要代码 :

package com.example.octopus_saveinstance;

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

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		if(savedInstanceState != null)
			System.out.println("onCreate() : " + savedInstanceState.getString("octopus"));
	}
	
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		System.out.println("onRestoreInstanceState() : " + savedInstanceState.getString("octopus"));
	}
	
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		
		outState.putString("octopus", "www.octopus.org.cn");
		System.out.println("onSaveInstanceState() : save date www.octopus.org.cn");
	}
	
}

运行结果 : 在运行的过程中 旋转屏幕;

I/System.out( 8167): onSaveInstanceState() : save date www.octopus.org.cn
I/System.out( 8167): onCreate() : www.octopus.org.cn
I/System.out( 8167): onRestoreInstanceState() : www.octopus.org.cn


作者:韩曙亮

转载请著名出处:http://blog.csdn.net/shulianghan/article/details/38297083

分享到:
评论

相关推荐

    Android代码-自动帮你完成 onSaveInstanceState 和 onRestoreInstanceState 的相关操作

    No boilerplate code like onSaveInstanceState or onRestoreInstanceState any more. Getting started Just add the @AutoRestore annotation to your fields that need to be saved and restored in Activities, ...

    Android中用onSaveInstanceState保存Fragment状态的方法

    主要介绍了Android中用onSaveInstanceState保存Fragment状态的方法,onSaveInstanceState可以将数据保存在Fragment或Activity中,需要的朋友可以参考下

    Android-教程精华-开发

    Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之 中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可 以用onSaveInstanceState保存其状态)。 对于Activity,关键是其...

    Android编程实现状态保存的方法分析

    在我们接电话的过程中,我们发信息的那个Activity是可能会被系统回收的,这时会调用Activity的onSaveInstanceState回调方法,而我们就可以在这个方法中保存状态数据,在onCreate方法或者在2.0之后提供的回调方法...

    onSaveInstanceState保存数据demo

    切换横竖屏,如何保存数据

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化 例如: 切换到横屏 onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume

    实例探究Android开发中Fragment状态的保存与恢复方法

    主要介绍了实例探究Android开发中Fragment状态的保存与恢复方法,或许开发者们对Fragment的操作都比较熟悉,但onSaveInstanceState()方法并不能够很好地保存Fragment状态,需要的朋友可以参考下

    retainstate

    发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务,以便恢复activity的状态。 为此,google提供了三种解决方案: 对于少量数据: 通过onSaveInstanceState(),保存有关...

    Android开发笔记

    该文档介绍了我在android studio开发中使用的一些常用和实用的技术,包括intent 广播机制,runOnUiThread,AlertDialog显示自定义布局文件问题,横竖屏切换保存状态onSaveInstanceState

    Android屏幕旋转 处理Activity与AsyncTask的最佳解决方案

    对于少量数据: 通过onSaveInstanceState(),保存有关应用状态的数据。 然后在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态。 对于大量数据:用 Fragment 保留需要回复的对象。 自行处理配置...

    Android相机 解决三星bug版本

    如果 activity 的销毁如果无法避免 那么在activity销毁之前调用 onSaveInstanceState 保存图片的路径 当activity重新创建的时候 会将 onSaveInstanceState 保存的文件传递给onCreate()当中 在onCreate当中 检查照片...

    Android onSaveInstanceState和onRestoreInstanceState触发的时机

    主要介绍了Android onSaveInstanceState和onRestoreInstanceState触发的时机的相关资料,需要的朋友可以参考下

    Android 中 onSaveInstanceState()使用方法详解

    Android 中 onSaveInstanceState()使用方法详解 覆盖onSaveInstanceState方法,并在onCreate中检测savedInstanceState和获取保存的值 @Override protected void onSaveInstanceState(Bundle outState) { outState...

    onSaveInstanceState调用的小例子

    通过这个例子描述onSaveInstanceState何时调用。非常简单的小例子。

    SharedPreferences例子源码

    SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的...

    Android中Fragment的解析和使用详解

    Android Fragment的生命周期和Activity类似,实际可能会涉及到数据传递,onSaveInstanceState的状态保存,FragmentManager的管理和Transaction,切换的Animation。 我们首先简单的介绍一下Fragment的生命周期。 ...

    Android代码-svc

    Easy and intuitive pattern library for Android Why SVC? MVP and MVVM use Fragment or Activity as "VIew" So when we write code inside the Fragment or Activity, codes are getting mixed with "View" code...

Global site tag (gtag.js) - Google Analytics