`

[Android Training视频系列]2.4 Recreating an Activity

阅读更多
1.主要内容
本讲讲解onSaveInstanceState与onRestoreInstanceState的使用。

2.视频讲解
http://www.eyeandroid.com/thread-11391-1-1.html

3.翻译参考
存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击Back按钮,或者自己调用finish()方法。另外,如果activity被停止了并且很久没被使用,或者前台的系统需要更多的资源,系统也可能会销毁你的activity。

当你的activity是因为按Back键或者自己结束的,那么系统认为这个activity实例已经是不需要了,因为你的行为明确指出了你要销毁它。然而,如果系统是强制销毁你的activity的话,虽然activity实例已经没有了,不过系统能够记住它的存在,当用户从新回到这个程序时,系统会使用activity被销毁时保存的状态重新创建一个activity实例。这个系统用来恢复先前状态的保存数据被称为“实例状态”,是一些key-value的集合保存在Bundle对象中。

警告:当用户旋转屏幕时,你的activity会被销毁并且重新创建。因为屏幕配置已经改变,你的activity可能也需要加载另外一些可选择的资源(比如布局)。

默认情况下,系统使用Bundle实例状态保存布局中每个View对象的信息(比如EditText对象中的文本值)。所以,如果你的activity对象被销毁和重新创建时,布局状态会重新恢复到先前的状态。不管怎样,你的activity可能有很多需要恢复的状态信息,比如追踪用户进程的成员变量。

为了你能够保存一些额外的数据到实例状态中,这里提供了一个额外的生命周期回调函数,它没有在前面课程的图例中显示出来。这个函数叫onSaveInstanceState(),当用户离开activity时系统会调用它。当你的activity被意外销毁时,系统会调用这个函数,函数的Bundle对象会被保存下来,所以你可以添加额外的信息给这个Bundle。然后,如果系统必须重启这个被销毁的activity,它就传递相同的Bundle对象给activity的onRestoreInstanceState()方法和onCreate()方法。




图解:当系统开始停止你的activity,它呼叫onSaveInstanceState()(1)方法,因此你可以保存指定的附加状态数据。如果activity被销毁了,然后相同的实例要被重新创建,系统传递定义在(1)的状态给onCreate()(2)和onRestoreInsatanceState()(3)。

保存你的activity状态
当你的activity开始停止,系统就调用onSaveInstanceState(),你可以在这个函数中使用key-value对的集合保存信息。默认函数实现了保存activity的view状态,比如EditText的文本,或者ListView的滚动条位置。

为了保存附加信息,你必须实现onSaveInstanceState()方法,添加key-value对到Bundle对象中,例如:
static final String STATE_SCORE = "playerScore"; 
static final String STATE_LEVEL = "playerLevel"; 
... 
 
@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // 保存用户当前游戏状态 
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 
     
    // 通常调用父类,让他能保存View的信息。 
    super.onSaveInstanceState(savedInstanceState); 


警告:通常需要在onSaveInstanceState()实现中调用它的父类方法,以便能够实现保存view的信息。

恢复你的activity状态
如果你的activity在它被销毁后重启,你可以从系统传递给你的Bundle中恢复保存的状态,onCreate()和onRestoreInstanceState()都可以接受到相同的包含实例状态信息的Bundle。

因为onCreate()函数在系统创建一个新的activity实例或者重新创建前一个activity时都会调用,所以你必须在读取Bundle前检查它是否为空,如果是空的,那么系统是创建一个新的实例,如果不是,那么就恢复前一个被销毁的activity。

例如,这里是onCreate()方法中实现恢复数据:
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // Always call the superclass first 
    
    // 检查是否是一个前面销毁的activity实例。 
    if (savedInstanceState != null) { 
        // 恢复玩家状态 
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
    } else { 
        // 为新实例初始化一个默认值 
    } 
    ... 


你也可以选择在onRestoreInstranceState()方法中实现,当系统调用完onStart()函数后会调用onRestoreInstranceState(),不过仅仅是当有状态需要恢复时才会调用,所以你不需要检查Bundle是否为空:
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // 调用父类恢复默认的View的状态 
    super.onRestoreInstanceState(savedInstanceState); 
    
    // 恢复玩家状态 
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 


警告:通常需要调用onRestoreInstanceState()的父类方法,以便能恢复默认的视图状态。

学习更多在运行中重建activity(比如屏幕旋转)的知识,可以看这里:Handling Runtime Changes.




  • 大小: 37.1 KB
1
0
分享到:
评论

相关推荐

    重建Activity-Recreating an Activity

    在Activity生命周期中,重建(Recreating an Activity)是一个重要的概念,涉及到Activity因不同原因被销毁(Destory)后重新创建(Create)的过程。根据给定的信息,我们可以详细探讨以下知识点: 1. Activity销毁...

    restring:Restring是一个可动态替换字符串资源的android库

    重新串起5.1.2 ...// Allows to update the text of views at runtime without recreating the activity implementation ' dev.b3nedikt.reword:reword:4.0.1 ' 2.初始化 在您的Application类中初始

    Android代码-lottie-android

    For the first time, designers can create and ship beautiful animations without an engineer painstakingly recreating it by hand. They say a picture is worth 1,000 words so here are 13,000: All of ...

    Android中使用ormlite实现持久化(一)--HelloOrmLite.docx

    在Android应用开发中,数据持久化是一个非常重要的环节,它使得应用程序可以在关闭后重新打开时仍然保留之前的数据。SQLite是一个轻量级的关系型数据库,被Android系统内置支持,但SQL语句的编写对于一些开发者来说...

    AppLocale:AppLocale是一个android库,可动态更新应用语言

    应用语言环境2.0.3 AppLocale是一个android库,用于动态更改应用程序语言。...viewpump:4.0.7 '// Allows to update the text of views at runtime without recreating the activityimplementation ' dev.b3ned

    bodymovin.zxp

    For the first time, designers can create and ship beautiful animations without an engineer painstakingly recreating it by hand. They say a picture is worth 1,000 words so here are 13,000:

    unidac_7_1_4_pro DELPHI 10 Tokyo

    Support for Firebird on Android platform is added Support for Firebird 3 packages is added Aliases handling in the RETURNING clause is supported The WireCompression connection parameter for Firebird 3...

    Unidac Pro 7.1.4 XE8

    Support for Firebird on Android platform is added Support for Firebird 3 packages is added Aliases handling in the RETURNING clause is supported The WireCompression connection parameter for Firebird 3...

    unidac_7_1_4_pro DELPHI 10 Berlin

    Support for Firebird on Android platform is added Support for Firebird 3 packages is added Aliases handling in the RETURNING clause is supported The WireCompression connection parameter for Firebird 3...

    recreating-shs-pages:我尝试仅使用 HTML 和 CSS 重新创建 Springdale High School 的网页

    6. **版本控制**:项目名为 "recreating-shs-pages-main" 暗示可能使用了 Git 进行版本控制,这是开发过程中常见的做法,以便跟踪更改、协同工作和回滚错误。 综上所述,这个项目涵盖了 HTML 和 CSS 的核心概念,...

    recreating-pag-main-instagram:Recriando apáginainicial do Instagram

    在本项目"recreating-pag-main-instagram"中,我们聚焦于使用CSS技术来复刻Instagram首页的界面设计。这个过程不仅能够提升你的CSS技能,还能深入理解如何构建响应式、现代且用户友好的Web界面。以下是一些关于CSS...

    Recreating-Bluprint-website:使用Bootstrap4,CSS和JQuery重新创建https:www.mybluprint.com网站

    在“Recreating-Bluprint-website”项目中,CSS用于定制Bootstrap的基础样式,以匹配原网站的设计。开发者可能编写了自定义CSS规则,调整字体、颜色、间距、边框等样式属性,同时可能运用了CSS选择器、层叠、布局...

    UniDAC 7.1.4

    Product Description Universal Data Access Components (UniDAC) is a library of components that provides direct access to most popular ...Bug with creating a database in the Direct Mode on Android is fixed

    Sausage.Fattener插件

    Sausage Fattener dada life 音色激励器 Recreating the sound of their favourite producer is the goal of many an aspiring fader jockey. So when renowned dance production duo Dada Life teamed up with ...

    DevExpress VCL 13.1.4(v2013vol1.4) 源码-例子-帮助-part2

    Q520547 - TcxVirtualVerticalGrid - Possible exception in the TcxvgPainter.DrawRow method when destroying and recreating rows within the BeginUpdate/EndUpdate block Q525420 - The Styles....

    DevExpress VCL 13.1.4(v2013vol1.4) 源码-例子-帮助-part1

    Q520547 - TcxVirtualVerticalGrid - Possible exception in the TcxvgPainter.DrawRow method when destroying and recreating rows within the BeginUpdate/EndUpdate block Q525420 - The Styles....

    local-storage:ver verdaccio的文件系统存储插件(内置)

    弃用的存储库该存储库已移至monodrepo,您​​可以在找到。 该软件包位于@ verdaccio /本地存储 :package: verdaccio的文件系统存储插件 该软件包已内置在verdaccio中npm install @verdaccio/local-storage原料药...

    UDAC 3.70.0.18 源码版

    Possibility to load data in TVirtualTable without recreating persistent fields is added Working in design time editor of the TVirtualTable component is improved Loading files opened by other ...

    EurekaLog_7.5.0.0_Enterprise

    Please, update your projects by renaming or recreating the component 2)....Important: File layout was changed for BDS 2006+. Delphi and C++ Builder files are now located in StudioNum folders instead ...

    docker_compose_openlava:使用docker-compose在docker上运行openlava

    Recreating devopsopenlava_master_1... Recreating devopsopenlava_node2_1... Recreating devopsopenlava_node3_1... Recreating devopsopenlava_node1_1... 列出启动的容器: $ docker ps CONTAINER ID IMAGE ...

Global site tag (gtag.js) - Google Analytics