Android开发入门教程(八):重新创建Activity

 说明:本文是我自己对官方入门教程(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";
...

@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的状态(Restore Your Activity State)

当你的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
    }
    ...
}

作为在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发入门可以通过以下步骤进行: 1.了解Android开发环境:Android开发主要使用Android Studio作为开发工具。Android Studio是由谷歌公司提供的一款集成开发环境,用于编写、调试和测试Android应用程序。 2.学习编程语言:Android应用程序主要使用Java或Kotlin进行开发。如果您已经熟悉其中一种编程语言,可以直接开始学习Android开发。如果您是初学者,建议先学习Java基础知识,然后再深入学习Android开发。 3.学习Android组件和API:Android应用程序由各种组件组成,如Activity、Fragment、Service、Broadcast Receiver和Content Provider等。了解这些组件的用途和功能对于开发Android应用程序至关重要。此外,还需要学习Android提供的各种API,以便在应用程序中实现不同的功能。 4.进行实际开发:通过创建简单的示例应用程序来练习和巩固所学知识。您可以从编写一个简单的"Hello World"应用程序开始,然后逐渐扩展功能和复杂性。 5.学习调试和测试:学习如何使用Android Studio的调试工具,以及如何进行单元测试和集成测试,以确保应用程序的质量和稳定性。 6.深入学习其他相关技术:一旦掌握了Android开发的基础知识,可以进一步学习其他相关技术,如数据库管理、网络通信、用户界面设计等,以提升应用程序的功能和用户体验。 总结:Android开发入门需要了解Android开发环境、编程语言、Android组件和API,并通过实际开发和调试来巩固所学知识。随着经验的增加,可以深入学习其他相关技术来提升应用程序的功能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值