Android Activity生命周期以及onSaveInstanceState、onRestoreInstanceState要点备忘

简介: 本文作者:Zhang Phil原文链接:http://blog.csdn.net/zhangphil/article/details/48155371Android Activity生命周期以及onSaveI...


本文作者:Zhang Phil

原文链接:http://blog.csdn.net/zhangphil/article/details/48155371


Android Activity生命周期以及onSaveInstanceState、onRestoreInstanceState要点备忘


一般的,当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追踪打印的结果输出说明了一切,如图:



相关文章
|
3月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
99 6
|
3月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
35 3
|
3月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
32 3
|
3月前
|
Android开发 开发者 UED
深入理解安卓应用开发中的生命周期管理
本文旨在探讨安卓应用开发中生命周期管理的重要性,以及如何有效利用生命周期解决常见问题。通过分析安卓应用生命周期的不同阶段及其特点,提供实用的代码示例和调试技巧,帮助开发者优化应用性能,提升用户体验。
54 8
|
3月前
|
Java Android开发 UED
深入探索安卓应用开发中的生命周期管理:从创建到销毁的全过程
在安卓应用开发中,理解并妥善管理应用及活动(Activity)的生命周期至关重要。本文将详细解析从应用创建到销毁的整个生命周期过程,以及如何通过高效管理提升应用性能与用户体验。
96 4
|
3月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
24 0
|
4月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
63 4
|
5月前
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
148 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
5月前
|
Android开发 UED 开发者
探索安卓应用的生命周期管理
【8月更文挑战第31天】在开发安卓应用时,理解并妥善处理应用的生命周期是至关重要的。本文将通过浅显易懂的方式,带你了解安卓应用的生命周期,并通过代码示例展示如何在实际应用中进行有效的生命周期管理。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
4月前
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
66 0