Android onPause和onSaveInstanceState的区别

onPause在Activity部分不可见的时候被调用,onSaveInstanceState在需要空出内存给当前Activity的时候执行。onSaveInstanceState有时候在onPause()运行前调用,有时候不(Pre-HONEYCOMB 版本前可能先调用onSaveInstanceState,之后onPause先调用)。Android
Activity的详细文档在这里

再来看函数名,onSaveInstanceState,保存的是Activity实例的状态,强调Instance。onPause是生命周期的一部分,属于正常的生老病死,没什么好解释的,如果想加强记忆,可以看gasolin 的这篇https://code.google.com/p/androidbmi/wiki/LifeCycle

默认的Activity onSaveInstanceState方法会做保存带id的view(Edittext这样的控件)的状态。我对view不甚了解,原文是:

“The default implementation takes care of most of the UI per-instance state for you by callingonSaveInstanceState()
on each view in the hierarchy that has an id, and by saving the id of the currently focused view (all of which is restored by the default implementation of
onRestoreInstanceState(Bundle)). If you override this method to save additional information
not captured by each individual view, you will likely want to call through to the default implementation, otherwise be prepared to save all of the state of each view yourself. ”

什么时候要重载onSaveInstanceState呢?绝大部分时候。但是因为默认的Activity onSaveInstanceState函数做了保存view状态的工作,所以重载的机会大大减少,变成如果你用了其它控件的时候(例如你自己做的画图控件,或者需要保存activity的一些属性值,如session id), 需要重载onSaveInstanceState。否则你的activity被回收后重新进入,图形数据全没了。

还有一个问题:什么时候需要重载onPause呢?释放资源的时候,这个很好理解;还有,你想在正常退出程序保存数据时。第二个重载原因有点违反直觉,要我给app例子的话我能想到“短信”、“记事本”,还有Android示例代码里的notepad。手机的操作大部分都是按返回键或者Home键,你分不清用户是要关闭你的程序还是切到其它app里,所以不管三七二十一,数据统统在onPause里存下来。当然,如果你要做得够细,需要在onDestroy里询问用户要不要保存,但有时onDestroy根本得不到机会执行activity就被kill掉了。如果再考虑调用其它activity时原来activity的onDestroy会被调用,就更拎不清。

onSaveInstanceState存储内容的方式和onPause不一样。onSaveInstanceState是存在系统缓存里,onPause写persistent data。为什么要这样呢? 因为Instance data只是在重新create activity时用,换句话说只是对app编写者有用,而onPause存下来的是对app用户有用的数据。

最后,让我们来想想Android的重启提示。如果你的app被后台kill掉了,onSaveInstanceState非常及时的把数据存在了Bundle里,但是用户选择了关机,Bundle里的数据还在吗?



时间: 2024-10-13 05:18:58

Android onPause和onSaveInstanceState的区别的相关文章

Android onPause 和onSaveInstanceState

当用户在开启一个新activity时,当前的activity可能在内存中处于停止状态也可能由于新activity需要更多内存而被系统杀掉了,但不论怎样,当用户在新activity上按返回键时,他希望看到的是原先的activity的界面.原先的activity如果是被重新创建,那么它要恢复到用户最后看到它的样子.那么我们怎么做呢?其实也不难,跟据上一节所述,在onPause()或onStop()或onDestyroy()中保存必要的数据就行了.但是现在google又冒出一个新的东西:onSaveI

Android Activity中onSaveInstanceState和onRestoreInstanceState的使用

Android Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法: 1. 基本作用: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate().onPause()等生命周期方法,它们并不一定会被触发.当应用遇到意外情况(如:内存不足.用户直接按Home键)由系统销毁一个Activity时,onSaveInstance

android 适配器simpleadapter和baseadapter区别

android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. adapter 是适配器模式,是数据和界面之间的桥梁.baseadapter 是一个抽象的类,要使用必需为其定义子类并实现相关方法.simpleadapter 派生于 baseadapter ,已经实现了相关的方法,所以可以直接使用.二者在使用效果上没有太大的区别,两者可以设计出几乎一模一样的界面.但在

Android getMeasuredHeight()与getHeight()的区别

public final int getMeasuredHeight () Added in API level 1 Like getMeasuredHeightAndState(), but only returns the raw width component (that is the result is masked by MEASURED_SIZE_MASK). Returns The raw measured height of this view. public final int

java的String和android的String有什么区别?

这是今天阿里电话面试被问到的,在之前确实没有想过(一直以为是一样的),于是面试完之后,我马上打开了源码,对这两个String类进行了比较,下面是我的发现. 首先我观察了这两个String类所导入的包,发现两者有些差异: 这是android版本: import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffe

Android Message和obtainMessage的区别

前几天需要实现一个以太网功能就看了以太网的源码部分,看见了源码部分在消息处理时,发现有一些不同的地方: 平时我在处理消息时: 1.首先创建Handler对象: private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 0: break; default: break; } }; }; 2.然后是消息处理: private void TestH

Android中@id与@+id区别

近日升级adt21+后,在输出apk时碰到编译layout异常,看了下是因为有人在layout引用一个不存在的resID时用了 @+id/xxx,而不是@id/xxx,导致debug编译器没显示错误,而在打包时的编译器出现错误,adt21-则没有此问题. 附上配图说明: Android中@id与@+id区别 : Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等

Android - match_parent 和 fill_parent的区别

Android - match_parent 和 fill_parent的区别 本文地址: http://blog.csdn.net/caroline_wendy match_parent 和 fill_parent的用法相同, 其实是完全一样的. API版本不同,推荐使用match_parent(API Level 8+).

Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述

原文:Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述 Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述: 可能刚刚接触Xamarin的人来说,对于这个概念比较的模糊,认为这说的不都是同一个东西吗?事实并不是这样的,我们先来说说Xamarin.Android和Xamarin.IOS吧,这两个其实就是一个单独的工程,在这里面我们可以针对安卓或者IOS进行代码的编写,而且支持原生的代码调用,这对于安卓或者IOS的开发