博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发入门教程(八):重新创建Activity
阅读量:7225 次
发布时间:2019-06-29

本文共 3611 字,大约阅读时间需要 12 分钟。

hot3.png

 说明:本文是我自己对官方入门教程(Training)的翻译,仅仅是为了记录自己的学习过程。由于本人英语水平太低,基本上是靠金山词霸加上自己的理解,所以翻译的不好。如果你有好的意见请留言,谢谢!

重新创建Activity(Recreating an Activity)

在有几个场景中,activity会被应用程序正常的行为所销毁,比如当用户按下返回(Back)按钮,或者activity通过调用finish()发送销毁自己的信号。该系统还会在activity处于停止状态且长时间没有被使用时销毁它,或者在前台activity需要更多的资源时,关闭后台进程以恢复可用内存。

当activity因为以下两种原因被销毁时:用户按下返回(Back)按钮或者activity自己要结束,从系统概念上讲,这个activity的实例就永远消失了,因为这种行为本身表明了不再需要这个activity了。然而,如果是由于系统的限制(而非正常程序行为)销毁了activity,那么即使实际activity的实例已经不在了,系统也会记得它存在过,当用户想返回时,系统会使用一套activity销毁时保存的状态信息创建一个新的activity实例。系统用来恢复activity以前的状态的这套数据信息,被称为“实例状态(instance state)”,是一个键值对的集合,存储在一个Bundle对象中。

注意:每次用户旋转手机屏幕的时候,你的activity都会被销毁并重新创建。当屏幕方向变化时,系统都会销毁并重新创建前景activity。因为当屏幕配置发生改变时,你的activity可能需要加载替代的资源(如布局)。

默认情况下,该系统使用的包实例状态保存,activity布局中每个视图对象的信息(如编辑框中输入的文本)。所以,当你的activity实例被摧毁和重建时,其布局状态可以自动恢复到以前的状态,而不需要你进行编码。然而,你的activity可能有更多的状态信息需要存储以便于恢复,例如那些记录用户进展的成员变量。

注:为了让Android系统能够恢复activity中视图的状态,每一个视图都必须有唯一的编号,由android:id属性指定。

为了保存更多activity的状态信息,你必须重载onSaveInstanceState()回调方法。当你的activity意外地被销毁,用户在离开你的activity时,系统就会调用这个方法,并通过Bundle对象保存信息。如果以后系统必须重新创建这个activity的实例,它会将同一个Bundle对象传递给onRestoreInstanceState()和onCreate()方法。

图2。当系统开始停止activity时,它会调用onSaveInstanceState()(1)这样,你可以指定一些在Activity实例必须重建时可能用到的额外的需要保存的数据。如果activity已经被销毁了,同一实例必须重建时,系统会将在(1)中保存的状态数据传递给onCreate()方法(2)和onRestoreInstanceState()方法(3)。

保存Activity的状态信息(Save Your Activity State)

当你的activity开始停止时,系统就会调用onSaveInstanceState()方法,这样你可以使用一系列键值对来保存activity的状态信息。这个方法的默认实现,从activity中视图(view)层面保存信息,诸如文本编辑框中的文字,或者下拉列表中卷轴的位置。

要保留更多activity的信息,你必须实现onSaveInstanceState()方法,在Bundle对象中添加键值对。例如:

static final String STATE_SCORE = "playerScore";static final String STATE_LEVEL = "playerLevel";...@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {    // Save the user's current game state    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);        // Always call the superclass so it can save the view hierarchy state    super.onSaveInstanceState(savedInstanceState);}

注意:总是调用父类onSaveInstanceState()的实现,默认的实现可以保存视图层次结构的状态。

恢复Activity的状态(Restore Your Activity State)

当你的activity(它以前被摧毁了)被重新创建后,你可以从系统传递给你的activity的Bundle中恢复你之前保存的状态。无论是onCreate()还是onRestoreInstanceState()回调方法都得到的是相同的Bundle,其中包含了实例的状态信息。

由于无论是新创建一个activity的实例,还是重新创建一个之前的实例,系统都会调用onCreate()方法。所以,你必须在准备读取Bundle之前,先检查它是否为空(NULL)。如果它是空(NULL),那么系统就是在创建activity的一个新实例,否则就是在恢复一个以前被销毁的实例。

下面的例子说明了,如何在onCreate()方法中恢复某些状态信息:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState); // Always call the superclass first       // Check whether we're recreating a previously destroyed instance    if (savedInstanceState != null) {        // Restore value of members from saved state        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);    } else {        // Probably initialize members with default values for a new instance    }    ...}

作为在onCreate()中恢复状态数据的替代方案,你可以选择实现系统调用onStart()方法后就会调用的onRestoreInstanceState()。系统仅在有一个可供恢复的状态信息时才调用onRestoreInstanceState(),所以你不需要检查Bundle是否为空:

public void onRestoreInstanceState(Bundle savedInstanceState) {    // Always call the superclass so it can restore the view hierarchy    super.onRestoreInstanceState(savedInstanceState);       // Restore state members from saved instance    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);}

注意:总是调用父类的实现,onRestoreInstanceState()默认的实现可以恢复视图层次结构的状态。

想要了解更多关于在运行时(例如当屏幕旋转时)重新创建activity的内容,请查看Handling Runtime Changes。

 

转载于:https://my.oschina.net/allenyao/blog/102064

你可能感兴趣的文章
Android layer-list的属性和使用具体解释
查看>>
若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet
查看>>
雾计算简史
查看>>
Python 随机数 random
查看>>
CentOS Linux搭建SVN服务器
查看>>
用Metaclass实现一个精简的ORM框架
查看>>
linux 使用fdisk分区扩容,看介绍命令(未完)
查看>>
[转]23种设计模式全解析
查看>>
pycharm 教程(一)安装和首次使用
查看>>
UNDO及MVCC、崩溃恢复
查看>>
CSS中的“>”是什么意思
查看>>
Service Worker和HTTP缓存
查看>>
ubuntu安装chrome
查看>>
java安全性的一种简单思路
查看>>
osquery简单试用
查看>>
PHP定时任务Crontab结合CLI模式详解
查看>>
矩阵快速幂求斐波那契数列
查看>>
【C#】获取"我的电脑"的名字,如This PC、这台计算机
查看>>
Powershell渗透测试系列–进阶篇
查看>>
java中的equals和==
查看>>