3.4 重新创建 Activity

在有些情况下,您的 Activity 会因正常应用行为而销毁,比如当用户按 返回按钮或您的 Activity 通过调用 finish()示意自己的销毁。 如果 Activity 当前被停止或长期未使用,或者前台 Activity 需要更多资源以致系统必须关闭后台进程恢复内存,系统也可能会销毁 Activity。

当您的 Activity 因用户按了返回 或 Activity 自行完成而被销毁时,系统的 Activity 实例概念将永久消失,因为行为指示不再需要 Activity。 但是,如果系统因系统局限性(而非正常应用行为)而销毁 Activity,尽管 Activity 实际实例已不在,系统会记住其存在,这样,如果用户导航回实例,系统会使用描述 Activity 被销毁时状态的一组已保存数据创建 Activity 的新实例。 系统用于恢复先前状态的已保存数据被称为“实例状态”,并且是 Bundle 对象中存储的键值对集合。

注意:每次用户旋转屏幕时,您的 Activity 将被销毁并重新创建。 当屏幕方向变化时,系统会销毁并重新创建前台 Activity,因为屏幕配置已更改并且您的 Activity 可能需要加载备用资源(比如布局)。

默认情况下,系统会使用 Bundle 实例状态保存您的 Activity 布局(比如,输入到 EditText 对象中的文本值)中有关每个 View 对象的信息。 这样,如果您的 Activity 实例被销毁并重新创建,布局状态便恢复为其先前的状态,且您无需代码。 但是,您的 Activity 可能具有您要恢复的更多状态信息,比如跟踪用户在 Activity 中进度的成员变量。

:为了 Android 系统恢复 Activity 中视图的状态,每个视图必须具有 android:id 属性提供的唯一 ID

要保存有关 Activity 状态的其他数据,您必须替代 onSaveInstanceState() 回调方法。当用户要离开 Activity 并在 Activity 意外销毁时向其传递将保存的 Bundle 对象时,系统会调用此方法。 如果系统必须稍后重新创建 Activity 实例,它会将相同的 Bundle 对象同时传递给 onRestoreInstanceState()onCreate() 方法。

图 2. 当系统开始停止您的 Activity 时,它会调用 onSaveInstanceState()(1),因此,您可以指定您希望在 Activity 实例必须重新创建时保存的额外状态数据。如果 Activity 被销毁且必须重新创建相同的实例,系统将在 (1) 中定义的状态数据同时传递给 onCreate() 方法 (2) 和 onRestoreInstanceState() 方法 (3)。

保存 Activity 状态

当您的 Activity 开始停止时,系统会调用 onSaveInstanceState() 以便您的 Activity 可以保存带有键值对集合的状态信息。 此方法的默认实现保存有关 Activity 视图层次的状态信息,例如 EditText 小部件中的文本或ListView 的滚动位置。

要保存 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

因为无论系统正在创建 Activity 的新实例还是重新创建先前的实例,都会调用 onCreate() 方法,因此您必须在尝试读取它之前检查状态 Bundle 是否为 null。 如果为 null,则系统将创建 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
    }
    ...
}

您可以选择实现系统在 onStart() 方法之后调用的 onRestoreInstanceState(),而不是在 onCreate() 期间恢复状态。系统只在存在要恢复的已保存状态时调用 onRestoreInstanceState(),因此您无需检查 Bundle 是否为 null:

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 的信息,请阅读处理运行时变更

时间: 2024-08-24 16:18:10

3.4 重新创建 Activity的相关文章

创建Activity

创建 Activity 分为3个步骤: 1.创建一个扩展子Activity的class 2.创建一个Layout 3.在 AndroidMainfest 中 配置这个Activity 4.在class中用setContentView方法指向Layout 一.创建class 推荐类的名称以Aty_开头,这样有利于将Activity的类与其他类区别开,这里我们的类名为Aty_TestActivity 点击“browse”按钮设置扩展类,点击finish完成创建 二.创建Layout 在弹出的窗口中填

重新创建Activity

重新创建Activity 在有些情况下,您的Activity会因正常应用行为而销毁,比如当用户按 返回按钮或您的Activity通过调用 finish()示意自己的销毁. 如果Activity当前被停止或长期未使用,或者前台Activity需要更多资源以致系统必须关闭后台进程恢复内存,系统也可能会销毁Activity. 当您的Activity因用户按了返回 或Activity自行完成而被销毁时,系统的 Activity 实例概念将永久消失,因为行为指示不再需要Activity. 但是,如果系统因

【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法

现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在现在的项目中使用的主要是afinal框架,而且这个框架确实比较不错,省去了不少工作量,在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样可以使用这个类给我们封装好的不少的方法,但是随着项目慢慢推进,这种直接继承框架类的一些缺点也开始慢慢的显现出来.最主要的就

关于Android创建Activity需要注意的地方

1.在onCreate()中加载UI,在onStart()/onResume()中刷新UI 2.在onCreate()中用Handler延时请求数据,数据处理最好是二次callback回调(第一次来自DB,第二次来自网络) 3.在Activity中尽量少创建Handler,创建一个UIHandler,一个后台HandlerThread足以 4.所有异步任务写进一个Runnable中,用自己写的应用后台线程池统一处理,而不是在Activity中直接new Thread() 5.异步Runnable

Android studio 不能创建Activity等文件

这是我之前安装Android studio的一系列问题:http://tieba.baidu.com/p/5921373177 1. 不能创建Activity等许多文件: 2. 工程运行不了: 3. 其他很多奇怪的问题就不一一列举了. 解决方案:在安装的时候,选择模式的时候选择Standard模式,这样虽然久点,但各种配置都会给你配置好的. 原文地址:https://www.cnblogs.com/zhangyuanqiang/p/9826549.html

【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法

今天,它可以被视为只是基本完成了其首个商业项目,在发展过程中,风格,然而随着工作经验的积累.最终開始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在如今的项目中使用的主要是afinal框架,并且这个框架确实比較不错,省去了不少工作量.在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样能够使用这个类给我们封装好的不少的方法,可是随着项目慢慢推进,这样的直接继承框架类的一些缺点也開始慢慢的显现出来.最基本的就是扩展性受到了一

如何创建Activity

1.一个Activity就是一个类,要继承Activity 2.需要复写OnCreat方法 3.新建的Activity要在Androidmainfest.xml中进行配置 4.为Acticity中添加各种空间 5.使用Intent 启用新的Activity Intent的最常用的用途是绑定应用程序组件.Intent用来在应用程序的Activity间启动.停止和传输. 这一章节中关于启动新的Activity的提示,也同样适用于Service.第8章可以了解到关于启动(和创建)Service的细节.

1.4.4 重新创建Activity

有几个场景中,Activity是由于正常的程序行为而被Destory的.例如当用户点击返回按钮或者是Activity通过调用finish()来发出停止信号.系统也有可能会在Activity处于stop状态且长时间不被使用,或者是在前台activity需要更多系统资源的时关闭后台进程,以图获取更多的内存. 当Activity是因为用户点击Back按钮或者是activity通过调用finish()结束自己时,系统就丢失了对Activity实例的引用,因为这一行为意味着不再需要这个activity了.

代理模式创建Activity

代码实现采用构造方法传递参数传递Activity实例的方式 public class ActivityHandler { protected Activity mActivityInstance; public ActivityHandler(Activity activity) { mActivityInstance = activity; } // this one is called before super.onCreate public void onPreCreate(Bundle