`

重新创建一个Activity(翻译)

 
阅读更多

重新创建一个Activity

这里有些场景,你的Activity因为普通的app行为被销毁了,比如当用点击返回按钮时或者你的Activity通过调用finish()方法通知自己被销毁了。系统也会销毁你的Activity,如果它当前被停止并且有较长时间没有被使用了,或者前台运行的Activity需要更多的系统资源导致系统必须关闭后台进程来恢复内存。

当你的Activity是因为用户点击了返回按钮或者是Activity自己结束自己的,系统对于这个Activity实例的概念是永远消失了,因为这个行为暗示这个Activity已经不再需要了。然而,如果系统销毁这个Activity实例是因为系统显示(而不是普通的app行为),则即使实际的Activity实例已经不在了,系统记得它是存在的,因此如果用户导航回这个Activity,系统使用一系列保存着的数据来创建这个Activity的新实例,这些数据描述Activity被销毁时的状态。系统用于恢复之前状态的保存着的数据被称为实例状态,是一个键值对的集合,保存在一个Bundle对象中。

警告:每次用户旋转屏幕时你的Activity会被销毁和重新创建。当屏幕改变方向时,因为屏幕配置变了,你的Activity可能需要加载替代的资源(比如布局),因此系统会销毁并重新创建前台运行的Activity。

默认的,系统使用Bundle实例状态来保存关于你的Activity布局中每个视图对象的信息(比如在文本框对象中已经输入的文本值)。因此,如果你的Activity被销毁和重新创建,布局的状态会被恢复到之前的状态,而你不需要写任何代码。然而,你的Activity可能还有更多的状态信息你希望被恢复,比如用于跟踪在这个Activity中用户进度的成员变量。

注意:为了让系统可以恢复你的Activity中各个视图的状态,每个视图必须有一个唯一的ID,通过android:id属性来提供。

为了保存关于Activity状态的额外数据,你必须重写(override)onSaveInstanceState()回调函数。当用户将要离开你的Activity时系统会调用这个方法,并传递给它保存在这个事件中的Bundle对象,这个事件是你的对象被意外销毁。如果系统在之后必须重新创建这个对象,它会传递同样的Bundle对象给onRestoreInstanceState()方法和onCreate()方法。

 保存你的Activity的状态

当你的Activity开始被停止时,系统调用onSaveInstanceState()方法,因此你的Activity可以使用一个键值对的集合保存状态信息。这个方法的默认实现保存Activity的视图层次的状态信息,比如文本框组件中的文本或者列表视图的滚动位置。

为了给你的Activity保存额外的状态信息,你必须实现onSaveInstanceState()方法并向Bundle对象增加键值对信息。例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public 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的状态

当你的Activity之前被销毁然后现在被重新创建时,你可以从系统传递给你的Activity的Bundle对象中恢复保存的数据。onCreate()和onRestoreInstanceState()方法都会收到同样的Bundle对象,包含着实例的状态信息。

因为onCreate()方法在系统创建你的Activity的新实例或重新创建之前的一个时都会调用,因此在你尝试去读它时必须检查这个Bundle对象是否是空的。如果它是空的,则系统正在创建这个Activity的一个新对象,而不是恢复之前被销毁的一个实例。

举个例子,这是你能在onCreate()方法如何恢复某些数据的例子:

@Override
protected 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()方法中恢复数据的替代方案,你可以选择实现onRestoreInstanceState()方法,系统在onStart()方法之后会调用它。系统只会在有保存的数据需要恢复时去调用它,因此你不需要检查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的信息,请阅读处理运行时变化。

  • 大小: 38.5 KB
分享到:
评论

相关推荐

    ShoppingList:一个简单的购物清单应用程序

    [GitHub工作流状态(分支)]( Status&logo = github)描述这是一个用于购物清单目的的简单Android应用程序。 它最初是在我在波兰留学期间的学期中完成的。 我以如何使用一张纸为模型进行建模,并使其尽可能简单。...

    iOS 5 Programming Cookbook中文翻译_第三章_构造和使用Table View

    iOS 5 Programming Cookbook是一本非常经典的iOS开发书籍,这本IOS5的实用书籍持续更新以满足新老开发者的需求,可以帮你解决在创建iPhone、iPad或者iPod应用时遇到的各种难题。这个版本包含大概100个方案,每个方案...

    iOS 5 Programming Cookbook中文翻译_第二章_使用控制器和视图(下)

    iOS 5 Programming Cookbook是一本非常经典的iOS开发书籍,这本IOS5的实用书籍持续更新以满足新老开发者的需求,可以帮你解决在创建iPhone、iPad或者iPod应用时遇到的各种难题。这个版本包含大概100个方案,每个方案...

    litho-facebook开源了litho一个高效的声明式UI框架。.zip

    }测试是否安装成功可以在activity中使用Litho创建一个view来测试是否安装成功。首先,初始化SoLoader。Litho依赖于SoLoader,它帮助加载由布局引擎Yoga提供的本地库。Application类适合做这件事情:[MyApplication....

    Android面试笔记之常问的Context

    Android程序不像Java程序,随便创建一个类,写个main()方法就能跑,而是要有一个完整的Android工程环境,在这个环境下,有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象...

    kotlin实现通知栏提醒功能示例代码

    一、概述 2019年英雄联盟LPL赛区赛季赛打得火热,作为一个RNG粉丝,想通过app实现RNG赛程提醒,于是就有了这次技术实践。...1、创建一个 Empty Activity 项目后,编辑 activity_main.xml 文件 <?xml

    Android Fragment的使用方法(翻译)

    创建一个Fragment 创建一个动态UI 多个Fragment之间的通信   1、使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。 如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。 ...

    andbook中文版

    13 Android Code Challenge……………… 14 创建Android 应用程序…………………15 剖析一个Android 应用程序……………………… 15 Activity…………………………………………………………………15 Intent ...

    Android插件

    CheckStyle-IDEA 是一个检查代码风格的插件,比如像命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,你们可以遵从像Google Oracle 的Java 代码指南 ,当然也可以按照自己的规则来设置配置文件,从而有效...

    精通ANDROID 3(中文版)1/2

    15.1 闹钟管理器基本知识:设置一个简单的闹钟  15.1.1 获取闹钟管理器  15.1.2 设置闹钟时间  15.1.3 设置闹钟接收程序  15.1.4 创建适合闹钟的PendingIntent  15.1.5 设置闹钟  15.1.6 测试项目  ...

    精通Android 3 (中文版)2/2

    15.1 闹钟管理器基本知识:设置一个简单的闹钟  15.1.1 获取闹钟管理器  15.1.2 设置闹钟时间  15.1.3 设置闹钟接收程序  15.1.4 创建适合闹钟的PendingIntent  15.1.5 设置闹钟  15.1.6 测试项目  ...

    google android sdk开发范例大全 第二版 PDF 光盘代码

     2.2 创建第一个Android项目(Hello Android!)   2.3 Android应用程序架构——从此开始   2.4 可视化的界面开发工具   2.5 部署应用程序到Android手机  第3章 用户人机界面   3.1 更改与显示...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 ...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 ...

Global site tag (gtag.js) - Google Analytics