重新创建一个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的信息,请阅读处理运行时变化。
相关推荐
"activity5.22设计器汉化"这个标题表明我们正在讨论一个特定版本(可能是v5.22)的Activity设计工具的本地化工作,即将其用户界面从英文翻译成中文,以方便中国开发者或使用者更好地理解和操作。 汉化通常涉及到...
CodeCoverageCheck Activity是针对Team Foundation Server 2010(TFS 2010)设计的一个特定功能,主要用于在持续集成(CI)环境中检查代码覆盖率。代码覆盖率是衡量测试质量的重要指标,它能帮助开发者了解有多少源...
当另一个Activity启动这个天气预报Activity时,由于其允许重新归属,因此可以灵活地根据相似性值改变所在的Task。 #### 五、总结 理解和掌握Activities和Tasks的工作机制对于开发高质量的Android应用程序至关重要...
您可以将多个Fragment组合到一个Activity中,建立一个多窗格UI,并重用一个Fragment在多个Activity中。 Fragment可以被认为是一个模块化的Activity部分,它有自己的生命周期,收到自己的输入事件,并且可以在...
在这个翻译Demo中,我们可能会看到一个Activity用于展示翻译界面,用户可以输入要翻译的文字并查看结果。 实现翻译功能的关键在于与有道翻译API的交互。首先,我们需要在有道翻译官网上注册开发者账号,获取到API ...
例如,一个Activity负责显示用户界面的一个屏幕,而Service则用于执行后台任务。 2. **Intent机制**:Intent是一种消息对象,它允许一个组件启动另一个组件。例如,你可以通过Intent启动另一个Activity或Service。...
在这个项目中,需要创建一个Activity来管理翻译界面。Intent用于在不同组件之间传递数据和启动服务。 4. **翻译API集成**:为了实现翻译功能,需要接入第三方翻译API,如Google Translate API或有道翻译API。这涉及...
- **安全性**:每个应用都运行在一个独立的Linux用户ID下,并且默认只能访问自身创建的文件和其他资源。这样的设计确保了应用之间的数据隔离,增强了整体的安全性。 #### 结论 通过深入了解这些基本概念和技术,...
在安卓平台上开发一款翻译软件,...通过以上知识点,我们可以构建出一个简单的安卓翻译软件。初学者可以从这个项目中学习到安卓应用的基本架构、网络请求、UI设计以及API的使用,为今后更复杂的项目打下坚实的基础。
可以有多个Activity组成一个应用,每个Activity通常负责一个具体的用户交互任务。 - **Service**: 在后台运行的组件,用于执行长时间运行的操作,如播放音乐。 - **BroadcastReceiver**: 接收来自系统和其他应用的...
4. **Activity与Intent**:Activity是Android应用的基本组件,代表用户界面的一个屏幕。Intent则是连接不同Activity的桥梁,用于启动新的Activity或者传递数据。 5. **布局与视图**:XML用于定义应用的用户界面,...
开发者可以通过创建一个继承自`AppWidgetProvider`的类来定义小部件的行为,并通过`AndroidManifest.xml`文件进行注册。 创建小部件的第一步是定义布局。这通常是一个XML文件,其中包含`RemoteViews`对象来描述小...
标题中的“Android应用源码在线英语翻译发音项目”暗示了这是一个关于Android平台的开源项目,其主要功能可能是为用户提供英语单词或句子的在线翻译及发音服务。这样的项目可以帮助开发者了解如何在Android应用中...
《Android中文翻译组—Android中文合集(7)》是一个为中文用户提供的Android开发资源集合,更新至2012年1月22日,包含了当时最全面、最新的Android API中文版信息。这个合集主要以CHM(Microsoft Compiled ...
- 在创建项目时,可以选择不同的活动模板,例如“BlankActivity”来开始构建应用程序。 - 在设计Android应用程序时,需要创建用户界面,并处理用户输入。 - Android应用的设计要遵循特定的设计指南和用户体验标准...
创建Fragment类似于创建Activity,你需要继承`Fragment`类并重写生命周期方法,如`onCreate()`, `onResume()`, `onPause()`等。关键区别在于,你需要重写`onCreateView()`来返回Fragment的布局视图。Fragment有自己...
指南包括了设置开发环境、创建第一个应用、用户界面设计、数据存储、网络编程、性能优化等多个章节。其中,设置开发环境涉及安装Android Studio、配置AVD(Android虚拟设备)、理解Gradle构建系统等步骤。创建第一个...
【安卓课设:翻译君APP.zip】是一个针对安卓平台的课程设计项目,旨在开发一个名为“翻译君”的应用程序。这个项目可能涵盖了多个Android应用开发的关键知识点,包括但不限于以下几个方面: 1. **Android Studio...
例如,如果一个应用需要展示滚动图片列表,而另一个应用已经开发了一个合适的滚动器并且将其公开供其他应用使用,那么前一个应用就可以调用这个滚动器来完成任务,而不是重新开发一个新的。在这种情况下,前一个应用...