管理 Activity 生命周期
2017-06-03 12:04
274 查看
通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要。 Activity 的生命周期会直接受到 Activity 与其他 Activity、其任务及返回栈的关联性的影响。
Activity 基本上以三种状态存在:
1. 继续
此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)
2. 暂停
另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。
3. 停止
该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。
如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其
注:正如以上示例所示,您在实现这些生命周期方法时必须始终先调用超类实现,然后再执行任何操作。
这些方法共同定义 Activity 的整个生命周期。您可以通过实现这些方法监控 Activity 生命周期中的三个嵌套循环:
* Activity 的整个生命周期发生在
* Activity 的可见生命周期发生在
* Activity 的前台生命周期发生在
下图说明了这些循环以及 Activity 在状态转变期间可能经过的路径。矩形表示回调方法,当 Activity 在不同状态之间转变时,您可以实现这些方法来执行操作。
不过,当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:
系统会先调用
注:无法保证系统会在销毁您的 Activity 前调用
不过,即使您什么都不做,也不实现
9c69
都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过
尽管
由于
注:由于无法保证系统会调用
您只需旋转设备,让屏幕方向发生变化,就能有效地测试您的应用的状态恢复能力。 当屏幕方向变化时,系统会销毁并重建 Activity,以便应用可供新屏幕配置使用的备用资源。 单凭这一理由,您的 Activity 在重建时能否完全恢复其状态就显得非常重要,因为用户在使用应用时经常需要旋转屏幕。
Activity 基本上以三种状态存在:
1. 继续
此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)
2. 暂停
另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。
3. 停止
该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。
如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其
finish()方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建。
实现生命周期回调
当一个 Activity 转入和转出上述不同状态时,系统会通过各种回调方法向其发出通知。 所有回调方法都是挂钩,您可以在 Activity 状态发生变化时替代这些挂钩来执行相应操作。 以下框架 Activity 包括每一个基本生命周期方法:public class ExampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // The activity is being created. } @Override protected void onStart() { super.onStart(); // The activity is about to become visible. } @Override protected void onResume() { super.onResume(); // The activity has become visible (it is now "resumed"). } @Override protected void onPause() { super.onPause(); // Another activity is taking focus (this activity is about to be "paused"). } @Override protected void onStop() { super.onStop(); // The activity is no longer visible (it is now "stopped") } @Override protected void onDestroy() { super.onDestroy(); // The activity is about to be destroyed. } }
注:正如以上示例所示,您在实现这些生命周期方法时必须始终先调用超类实现,然后再执行任何操作。
这些方法共同定义 Activity 的整个生命周期。您可以通过实现这些方法监控 Activity 生命周期中的三个嵌套循环:
* Activity 的整个生命周期发生在
onCreate()调用与
onDestroy()调用之间。您的 Activity 应在
onCreate()中执行“全局”状态设置(例如定义布局),并释放
onDestroy()中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在
onCreate()中创建该线程,然后在
onDestroy()中停止该线程。
* Activity 的可见生命周期发生在
onStart()调用与
onStop()调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用
onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个
BroadcastReceiver以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在
onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用
onStart()和
onStop()。
* Activity 的前台生命周期发生在
onResume()调用与
onPause()调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用
onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
下图说明了这些循环以及 Activity 在状态转变期间可能经过的路径。矩形表示回调方法,当 Activity 在不同状态之间转变时,您可以实现这些方法来执行操作。
保存 Activity 状态
管理 Activity 生命周期的引言部分简要提及,当 Activity 暂停或停止时,Activity 的状态会得到保留。 确实如此,因为当 Activity 暂停或停止时,Activity 对象仍保留在内存中 — 有关其成员和当前状态的所有信息仍处于活动状态。 因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当 Activity 返回前台(当它“继续”)时,这些更改仍然存在。不过,当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:
onSaveInstanceState()。
系统会先调用
onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个
Bundle,您可以在其中使用
putString()和
putInt()等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将
Bundle同时传递给
onCreate()和
onRestoreInstanceState()。您可以使用上述任一方法从
Bundle提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的
Bundle是空值(如果是首次创建该 Activity,就会出现这种情况)。
注:无法保证系统会在销毁您的 Activity 前调用
onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用
onSaveInstanceState(),它会在调用
onStop()之前,并且可能会在调用
onPause()之前进行调用。注:无法保证系统会在销毁您的 Activity 前调用
onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用
onSaveInstanceState(),它会在调用
onStop()之前,并且可能会在调用
onPause()之前进行调用。
不过,即使您什么都不做,也不实现
onSaveInstanceState(),Activity 类的
onSaveInstanceState()默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的
onSaveInstanceState()方法,让每个视图
9c69
都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过
android:id属性)。如果小部件没有 ID,则系统无法保存其状态。
尽管
onSaveInstanceState()的默认实现会保存有关您的Activity UI 的有用信息,您可能仍需替换它以保存更多信息。例如,您可能需要保存在 Activity 生命周期内发生了变化的成员值(它们可能与 UI 中恢复的值有关联,但默认情况下系统不会恢复储存这些 UI 值的成员)。
由于
onSaveInstanceState()的默认实现有助于保存 UI 的状态,因此如果您为了保存更多状态信息而替换该方法,应始终先调用
onSaveInstanceState()的超类实现,然后再执行任何操作。 同样,如果您替换
onRestoreInstanceState()方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。
注:由于无法保证系统会调用
onSaveInstanceState(),因此您只应利用它来记录 Activity 的瞬态(UI 的状态)— 切勿使用它来存储持久性数据,而应使用
onPause()在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)。
您只需旋转设备,让屏幕方向发生变化,就能有效地测试您的应用的状态恢复能力。 当屏幕方向变化时,系统会销毁并重建 Activity,以便应用可供新屏幕配置使用的备用资源。 单凭这一理由,您的 Activity 在重建时能否完全恢复其状态就显得非常重要,因为用户在使用应用时经常需要旋转屏幕。
相关文章推荐
- app整个应用生命周期管理ActivityLifecycleCallbacks,registerActivityLifecycleCallbacks
- Android Activity生命周期管理
- 安卓训练-开始-管理 Activity 生命周期
- 4.0 Activity的生命周期管理
- 在Android工程中管理Activity的生命周期
- MVP项目研究——AppManager融合Dagger2和androidEventbus管理Activity的生命周期
- 管理Activity的生命周期(1)
- 关于Activity生命周期的管理
- Android doc |Getting Started|部分 转载 --管理Activity生命周期
- Android Activity---管理Activity的生命周期
- Activity的生命周期管理
- Android-管理Activity生命周期 -重新创建Activity
- Managing the Activity Lifecycle--管理Activity生命周期
- 管理Activity的生命周期
- [安卓基础] 007.管理Activity的生命周期
- 【转】Android Activity生命周期管理
- Android 组件 — Activity (生命周期管理)
- Android文档Training之管理Activity生命周期
- 管理Activity的生命周期(4)重建Activity