onSaveInstanceState和onRestoreInstanceState的用处

2024-06-11 17:08

本文主要是介绍onSaveInstanceState和onRestoreInstanceState的用处,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Activity类中包含的onSaveInstanceState和onRestoreInstanceState有什么用,首先使用这两个方法时一定要注意情况和了解Activity的生命周期,否则有的时候 

onSaveInstanceState和onRestoreInstanceState 可能不会被触发,虽然他们都是Activity的重写方法。

  他们比较常用到的地方是 Sensor、Land和Port布局的自动切换,以前解决横屏和竖屏切换带来的数据被置空或者说onCreate被重复调用问题,其实Android提供的

onSaveInstanceState方法可以保存当前的窗口状态在即将布局切换前或当前Activity被推入历史栈,其实布局切换也调用过onPause所以被推入Activity的history stack,如果我们的Activity在后台没有因为运行内存吃紧被清理,则切换回时会触发onRestoreInstanceState方法。

 这两个方法中参数均为Bundle,可以存放类似 SharedPreferences 的数据,所以使用它们作为当前窗口的状态保存是比较合适的。实际使用代码

[java]  view plain copy
  1. @Override  
  2.   protected void onSaveInstanceState(Bundle outState){  
  3.              outState.putString("lastPath""/sdcard/android123/cwj/test");  
  4.    }  
  5.   
  6.   
  7. @Override   
  8. public void onRestoreInstanceState(Bundle savedInstanceState) {   
  9. super.onRestoreInstanceState(savedInstanceState);   
  10.   
  11. String cwjString = savedInstanceState.getString("lastPath");   
  12. }   


实例:

[java]  view plain copy
  1. public class TestPictureLayout extends Activity {  
  2.   
  3.      static final int DAY_VIEW_MODE = 0;  
  4.      static final int WEEK_VIEW_MODE = 1;  
  5.   
  6.      private SharedPreferences mPrefs;  
  7.      private int mCurViewMode;  
  8.   
  9.      private int i;  
  10.   
  11.      protected void onCreate(Bundle savedInstanceState) {  
  12.          super.onCreate(savedInstanceState);  
  13.   
  14.          SharedPreferences mPrefs = getSharedPreferences();  
  15.          mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);  
  16.   
  17. if(savedInstanceState!=null)  
  18.   
  19. {  
  20.   
  21. i=savedInstanceState.getInt("data");  
  22.   
  23. //这个是之前保存的数据  
  24.   
  25. }  
  26.   
  27. else{  
  28.   
  29. //这个是从另外一个界面进入这个时传入的  
  30.   
  31. i=getIntent().getint("data");  
  32.   
  33. }  
  34.   
  35.         
  36.      }protected void onPause() {  
  37.          super.onPause();  
  38. //界面失去控制权时保存数据  
  39.          SharedPreferences.Editor ed = mPrefs.edit();  
  40.          ed.putInt("view_mode", mCurViewMode);  
  41.          ed.commit();  
  42.      }  
  43. }  
  44.   
  45.   @Override  
  46. public void onSaveInstanceState(Bundle outState) {  
  47.   
  48. //界面销毁之前保存数据  
  49. super.onSaveInstanceState(outState);  
  50. outState.putInt("data",1);}  
  51.   
  52. @Override  
  53. public void onRestoreInstanceState(Bundle savedInstanceState) {  
  54.   
  55. //执行于onStart()之后,回复之前保存过的数据,其实可以不要,因为oncreate中已经获取过了  
  56.   
  57. super.onRestoreInstanceState(savedInstanceState);  
  58. i=savedInstanceState.getInt("data");  
  59. }  
  60.   
  61. }  


 

实例分析:
在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者 onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该 activity在将来某个时刻回来时可以恢复其先前状态。例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。
不要将这个方法和activity生命周期回调如onPause()或onStop()搞混淆了,onPause()在activtiy被放置到背景或者自行销毁时总会被调用,onStop()在activity被销毁时被调用。一个会调用onPause()和onStop(),但不触发 onSaveInstanceState的例子是当用户从activity B返回到activity A时:没有必要调用B的onSaveInstanceState(Bundle),此时的B实例永远不会被恢复,因此系统会避免调用它。

一个调用 onPause()但不调用onSaveInstanceState的例子是当activity B启动并处在activity A的前端:如果在B的整个生命周期里A的用户界面状态都没有被破坏的话,系统是不会调用activity A的onSaveInstanceState(Bundle)的。默认的实现负责了大部分UI实例状态(的保存),采用的方式是调用UI层上每个拥有id的view的onSaveInstanceState() ,并且保存当前获得焦点的view的id(所有保存的状态信息都会在默认的onRestoreInstanceState(Bundle)实现中恢复)。

如果你覆写这个方法来保存额外的没有被各个view保存的信息,你可能想要在默认实现过程中调用或者自己保存每个视图的所有状态。如果被调用,这个方法会在onStop()前被触发,但系统并不保证是否在onPause()之前或者之后触发。

这篇关于onSaveInstanceState和onRestoreInstanceState的用处的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051773

相关文章

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

Activity状态保存【onSaveInstanceState和onRestoreInstanceState】

Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法: 1. 基本作用:   Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()

海洋生物材料及其衍生物在3D生物打印中的用处

大家好,今天我们来聊一聊 海洋衍生生物材料在3D 生物打印的引言——《Recent Developments in Bio-Ink Formulations Using Marine-Derived Biomaterials for Three-Dimensional (3D) Bioprinting》。3D 生物打印具有巨大的应用潜力,在生物医学、制药等领域有望带来革命性的

Linux下各个MySQL安装包的用处

我用的Linux操作系统的版本是国产麒麟操作系统,所以下载时在 select platform 就选择了Linux - Generic,不知道对不对。然后在下面列出很多可供下载的安装包来,顿时就晕了。这些安装包包括:Development LibrariesClient UtilitiesTest SuiteClient UtilitiesMySQL ServerShared comp

spring的用处

在SSH框假中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句。Struts是用来做应用层的,他它负责调用业务逻辑serivce层。所以SSH框架的流程大致是:Jsp页面----Struts------Service(业务逻辑处理类)---Hibernate(左到右)

C#部分方法有什么用处?和传统方法有什么区别?什么时候用合适?

在C#中,部分类(partial class)和部分方法(partial method)是两个不同的概念,但它们经常一起使用,特别是在代码生成和框架设计中。下面我将分别解释这两个概念,并讨论它们的用处、与传统方法的区别以及何时使用它们。 部分类(Partial Class) 用处: 当一个类被定义在多个文件中时,可以使用partial关键字来分割这个类。这允许自动生成的代码(如由设计器生成的

java中的java.lang.reflect.Type在Spring框架中的用处

背景介绍 Type在java中表示类型,包括了 Class: ParametedType: List WildType: 如 ArrayType: 如T[] TypeVariable: 如T 解决一个实际问题 需求:假设我们有一个Repository接口,有2个实现类Repository和Repository2个bean,但是我们只想用到其中的一个bean,如personRepository

android BaseColumns的用处

1、ContentProvider的基本概念      1> ContentProvider为存储和读取数据提供了统一的接口      2> 使用ContentProvider,应用程序可以实现数据共享      3> android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等) 2、Uri      1> 每一个Co

PHP和Java的区别和用处?答案在这里

Java是一种通用的面向对象编程语言,旨在生成可在任何地方使用相同代码的代码。这种编程语言是基于类的,面向对象的和人类可读的。它支持服务器端和客户端。 Java既可以编译也可以解释。Java编译器将源代码转换为字节码,然后java解释器生成机器代码,该机器代码由运行java程序的机器直接执行。它可靠,分布式,便携。它可用于开发独立应用程序或基于Web的应用程序。 PHP被称为超文本预处理

C++ static_cast、dynamic_cast、const_cast 和 reinterpret_cast 用处和区别

在 C++ 中,static_cast、dynamic_cast、const_cast 和 reinterpret_cast 是四种类型转换运算符,它们各自有不同的用途和行为: static_cast 用于编译时已知类型的转换,如基本数据类型转换、派生类到基类的转换、指针和引用的转换等。不能用于去除 const 属性或进行多态类型的向下转换。 dynamic_cast 用于运行时类型检查的