onRetainNonConfigurationInstance和getLastNonConfigurationInstance

很多网友可能知道Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生 onRestoreInstanceState,但是Android的Activity类还有一个方法名为 onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。

我们可以通过  onRetainNonConfigurationInstance 代替 onSaveInstanceState,比如

@Override
  public Object onRetainNonConfigurationInstance()
 {    
       //这里需要保存的内容,在切换时不是bundle了,我们可以直接通过Object来代替
      return obj;
 }

在恢复窗口时,我们可以不使用 onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如

Object obj = getLastNonConfigurationInstance();     最终obj的内容就是上次切换时的内容。

这里Android123提醒大家,每次Activity横竖屏切换时onCreate方法都会被触发。

转:http://www.android123.com.cn/androidkaifa/610.html

第二篇:

Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是
Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和
getLastNonConfigurationInstance这两个方法。

当Device
configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一
样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity
Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。

用这个方法保存Activity State后,通过getLastNonConfigurationInstance()在新的Activity Instance中恢复原有状态。比如:

[java] view plaincopy

  1. @Override
  2. public Object onRetainNonConfigurationInstance() {
  3. final MyDataObject data = MyLoadedData();
  4. return data;
  5. }

在恢复窗口时,我们可以不使用onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如

[java] view plaincopy

  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.main);
  5. final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
  6. if (data == null) {
  7. data = loadMyData();
  8. }
  9. ...
  10. }

这个方法最大的好处是:
    * 当Activity曾经通过某个资源得到一些图片或者信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。
    * 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。
    * 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。

下边是需要特别注意的几点:
    * onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用。

* 调用顺序同样介于onStop() 和 onDestroy()之间。

时间: 2024-10-14 14:05:50

onRetainNonConfigurationInstance和getLastNonConfigurationInstance的相关文章

Android 程序员必须知道的 53 个知识点

1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式运行来看都是 startActivity 可能会使用 FLAG_ACTIVITY_NEW_TASK 标记来打开一个新窗口,比如 Launcher,所以考虑单任务的实现方法比较简单,首先 Android123 纠正下大家一种错误的方法就是直接在androidmanifest.xml 的 applica

Android Configuration change引发的问题及解决方法(转)

之前在学习Fragment和总结Android异步操作的时候会在很多blog中看到对Configuration Change的讨论,以前做的项目都是固定竖屏的,所以对横竖屏切换以及横竖屏切换对程序有什么影响都没什么了解.见到的次数多了,总是掠过去心理总觉得不踏实,最终还是好好看了些介绍Congifuration Change的blog,在此做个梳理也不枉花了那么多时间.有疏漏和描述不准确的地方恳请指正. 前言 在研究Configuration Change之前我主要的疑问: 横竖屏切换对布局有影

【Android开发】InstanceState详解

首先来介绍onSaveInstanceState() 和 onRestoreInstanceState() .关于这两个方法,一些朋友可能在Android开发过程中很少用到,但在有时候掌握其用法会帮我们起到比较好的效果.尤其是在应用程序在不知道的情况下退出后,如何实现其数据保存的功能.先来让我们看下这两个方法的有什么样的作用. 1. 基本作用:  Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 o

Android开发之InstanceState详解

Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能.Android实现屏幕旋转异步下载效果这样两个示例. 首先来介绍onSaveInstanceState() 和 onRestoreInstanceState() .关于这两个方法,一些朋友可能在Andr

【译】用Fragment解决屏幕旋转(状态发生变化)产生的状态不能保持的问题

这篇文章解决了在StackOverflow上一个经常被提到的问题. 在配置发生变化(Configuration changs)时,什么是最好的保存活动对象方法,比如运行中的线程,Sockets,AsyncTask. 要回答这个问题,我们要先讨论一些开发者在Activity生命周期中使用长时间后台任务时遇到的共同困难.然后,我们将介绍常见的两种能解决问题但有不好的方法.最后,我们会用一个示例代码说明推荐的解决方案,它用retained fragment来达到我们的目标. 配置改变&后台线程(Con

Android开发网上的一些重要知识点[经验分享]

1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来打开一个新窗口,比如Launcher,所以考虑单任务的实现方法比较简单,首先Android123纠正下大家一种错误的方法就是直接在androidmanifest.xml的application节点中加入android

Android 基础总结:(四)Activity(InstanceState)

本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState()和onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能.Android实现屏幕旋转异步下载效果这样两个示例. 首先来介绍onSaveInstanceState()和onRestoreInstanceState().关于这两个方法,一些朋友可能在Android开发过程中很少用到,但在有时候掌握其用法会帮我们起到比较

Activity生命周期函数、onSaveInstanceState()和onRestoreInstanceState()的介绍

本文涉及了Activity中的 onSaveInstanceState() 和 onRestoreInstanceState()方法,需要注意的他们并不是生命周期方法.我放在这是为了整合起来讲解. 一.生命周期中的方法调用时机 本文转自:http://blog.csdn.net/android_tutor/article/details/5772285 1) 首次执行时执行:onCreate()->onStart()->onResume() 2) 部分可见(被对话框等遮挡)时执行:onPaus

Activity重要函数

一.onConfigurationChanged 与 android:configChanges Lists configuration changes that the activity will handle itself. When a configuration change occurs at runtime, the activity is shut down and restarted by default, but declaring a configuration with t