Managing the Activity Lifecycle(管理Activity的生命周期)
主要通过Activity的生命周期的回调方法,来处理Activity处于不同的状态。
不同于使用 main() 方法启动应用的其他编程,Android 系统会通过调用对应于其生命周期中特定的回调方法在 Activity 实例中启动代码。 有一系列可启动Activity的回调方法,以及一系列可分解Activity的回调方法。
1.Understand the Lifecycle Callbacks 明白Activity生命周期的回调
然而,这些状态中只有三种可以是静态。 也就是说,Activity只能在三种状态之一下存在很长时间。
Resumed 重新恢复
在这种状态下,Activity处于前台,且用户可以与其交互。有时也称为“运行”状态。
Paused 暂停
在这种状态下,Activity被在前台中处于半透明状态或者未覆盖整个屏幕的另一个Activity—部分阻挡。 暂停的Activity不会接收用户输入并且无法执行任何代码。
Stopped 停止
在这种状态下,Activity被完全隐藏并且对用户不可见;它被视为处于后台。 停止时,Activity实例及其诸如成员变量等所有状态信息将保留,但它无法执行任何代码。
其他状态(“创建”和“开始”)是瞬态,系统会通过调用下一个生命周期回调方法从这些状态快速移到下一个状态。 也就是说,在系统调用 onCreate() 之后,它会快速调用 onStart(),紧接着快速调用 onResume()。
2.Specify Your App’s Launcher Activity 指定应用程序的启动Activity
应用程序的主Activity必须使用 (包括 MAIN 操作和 LAUNCHER 类别)在宣示说明中声明。例如:
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3.Create a New Instance 创建一个新的实例
注意:使用 SDK_INT 可防止旧版系统以这种方式仅在 Android 2.0 (API 级别5)和更高级别执行新 API 工作。 较旧版本会遇到运行时异常。
一旦 onCreate() 完成执行操作,系统会相继调用 onStart() 和 onResume() 方法。 Activity从不会驻留在“已创建”或“已开始”状态。在技术上,Activity会在 onStart() 被调用时变得可见,但紧接着是 onResume(),且Activity保持“继续”状态,直到有事情发生使其发生变化,比如当接听来电时,用户导航至另一个Activity,或设备屏幕关闭。
4.Destroy the Activity 销毁Activity
注意:在所有情况下,系统在调用 onPause() 和 onStop() 之后都会调用 onDestroy() ,只有一个例外:当您从 onCreate() 方法内调用 finish() 时。在有些情况下,比如当您的Activity作为临时决策工具运行以启动另一个Activity时,您可从 onCreate() 内调用 finish() 来销毁Activity。 在这种情况下,系统会立刻调用 onDestroy(),而不调用任何其他 生命周期方法。
当半透明Activity打开时(比如对话框样式中的Activity),上一个Activity会暂停。 只要Activity仍然部分可见但目前又未处于焦点之中,它会一直暂停。但是,一旦Activity完全被阻挡并且不可见,它便停止。
当半透明Activity阻挡您的Activity时,系统会调用 onPause() 并且Activity会在“暂停”状态下等待 (1)。 如果用户在Activity仍然处于暂停状态时返回Activity,则系统会调用 onResume() (2)。
1.Pause Your Activity 暂停Activity
应避免在 onPause() 期间执行 CPU 密集型工作,比如向数据库写入信息,因为这会拖慢向下一Activity过渡的过程。应改为在 onStop()期间执行高负载关机操作。通过相对简单的方式在 onPause() 方法中完成大量操作,这样才能加快在您的Activity在确实停止的情况下用户向下一个目标过渡的速度。
2.Resume Your Activity 恢复Activity
当用户从“暂停”状态继续您的Activity时,系统会调用 onResume() 方法。
Activity 提供两种生命周期方法:onStop() 和 onRestart(),这些方法专门处理正在停止和重新开始的Activity。
用户离开Activity时,系统会调用 onStop() 停止Activity(1)。 如果用户在Activity停止时返回,系统会调用 onRestart() (2),紧接着调用 onStart() (3) 和 onResume() (4)。 注意:无论什么场景导致Activity停止,系统始终会在调用 onStop() 之前调用 onPause()。
1.Stop Your Activity 停止Activity
当Activity收到 onStop() 方法的调用时,它不再可见,并且应释放几乎所有用户不使用时不需要的资源。 一旦Activity停止,如果需要恢复系统内存,系统可能会销毁该实例。 在极端情况下,系统可能会仅终止应用进程,而不会调用Activity的最终 onDestroy() 回调,因此使用 onStop() 释放可能泄露内存的资源非常重要。
尽管 onPause() 方法在 onStop()之前调用,但使用 onStop() 执行更大、占用更多 CPU 的关闭操作,比如向数据库写入信息。
注意:即使系统在Activity停止时销毁了Activity,它仍会保留 Bundle(键值对的二进制大对象)中的 View 对象(比如 EditText 中的文本),并在用户导航回Activity的相同实例时恢复它们 。
2.Start/Restart Your Activity 重新开始Activity
当Activity从停止状态返回前台时,它会接收对 onRestart() 的调用。系统还会在每次在Activity变为可见时调用 onStart() 方法(无论是正重新开始还是初次创建)。 但是,只会在Activity从停止状态继续时调用 onRestart() 方法,因此可以使用它执行只有在Activity停止之前但未销毁的情况下可能必须执行的特殊恢复工作。