`
litzhiai
  • 浏览: 1367 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Activity之onSaveInstanceState

 
阅读更多

onSaveInstanceState和onRestoreInstanceState触发的时机

先看Application Fundamentals上的一段话:

 

 Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)

 

从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:


1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则


2、长按HOME键,选择运行其他的程序时。


3、按下电源按键(关闭屏幕显示)时。


4、从activity A中启动一个新的activity时。


5、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

 

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

 


至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行


另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原

 

1.finish()方法:

        当强制结束活动程序时,可以调用finish()方法实现。

2.isfinishing():判定活动程序Activity是否结束。

3.onLowMemory():内存不足时会调用这个方法。

 

分享到:
评论

相关推荐

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

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

    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状态的方法

    在Fragment里面,利用onSaveInstanceState保存数据,并可在onActivityCreated里面恢复数据。 public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... ...

    Android-教程精华-开发

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

    View的状态是如何保存的

    然后Activity的onSaveInstanceState、onRestoreInstanceState最终也会调用到控件的这两个同名方法。View的初始化时要调用setSaveEnabled(true) 。 另外,想要保存View的状态,需要在XML布局文件中提供一个

    Android Activity 横竖屏切换的生命周期

    onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据 横竖屏切换生命周期 1、启动程序进入Activity界面...

    Android相机 解决三星bug版本

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

    retainstate

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

    Node.js-一个框架可以自动生成OnSaveInstanceState代码

    android 内存被回收是一个开发者的常见问题。当我们跳转到一个二级界面,或者切换到后台的时候,如果时间过长或者手机的内存不足,当我们再返回这个界面的时候,activity或fragment就会被内存回收。

    Android onSaveInstanceState和onRestoreInstanceState触发的时机

     Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user ...

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

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

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

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

    Android代码-svc

    "View" code and "Screen Code" such as onCreate,onCreateView, onViewCreated or onSaveInstanceState, onRestoreInstanceState.onActivityResult etc. It makes hard to see each "View Logic" and "Screen Logic...

    zxing.java源码解析-Android_Interview:Android_面试

    zxing.java源码解析 知识点总结 数据结构与算法: ...onSaveInstanceState() 7.http与https的区别 此处延伸:https的实现原理 23.自定义view和动画 以下两个讲解都讲得很透彻,这部分面试官多数不会问

    详解Activity生命周期

    详解Activity生命周期一、概述1.方法简述2.三种周期二、生命周期中涉及到的其他方法1.onSaveInstanceState() 方法2.onBackPressed()方法三、四条生命线Line 1 onCreate() → onDestroy() 完整生命周期Line 2 onStart...

    android横竖屏切换时候Activity的生命周期

    1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate–> onStart–> onResume–> 3、按crtl+f12切换成横屏时 onSaveInstanceState–> onPause–> onStop–> onDestroy–> ...

    Android生存指南之:开发中的注意事项

    区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,...

    Android面试题

    Android面试之---Activity的详细讲解 这篇文章会涉及到以下几个...三 你后台的Activity被系统回收怎么办:onSaveInstanceState 四 调用与被调用:我们的通信使者 - Intent Android面试之---Android的虚拟机Dalvik 介绍

    联想与百度android面试题集

    联想与百度android的面试题合集 一 Activity的生命周期 二 让Activity变成一个窗口:Activity属性设定 三 你后台的Activity被系统 回收怎么办:onSaveInstanceState 四 调用与被调用:我们的通信使者 - Intent

Global site tag (gtag.js) - Google Analytics