- Android应用开发教程
- 赵明渊
- 2123字
- 2025-02-21 19:39:28
3.3 Activity的运行状态和生命周期
Activity生命周期指Activity从启动到销毁的过程,下面介绍Activity的运行状态和生命周期。
3.3.1 Activity的运行状态
Activity的生命周期中存在五种状态:启动状态、运行状态、暂停状态、停止状态、销毁状态。
(1)启动状态(Starting):Activity在屏幕的前台。
(2)运行状态(Running):Activity可见,获得焦点,可与用户进行交互。Activity启动后,随即进入运行状态。
(3)暂停状态(Paused):Activity失去焦点,但仍可见,依然保持活力,但在系统内存极低时将被杀掉。
(4)停止状态(Stopped):Activity失去焦点,不可见,此时Activity被另一个Activity完全覆盖,系统可以随时将其释放。
(5)销毁状态(Destroyed):系统将Activity从内存中删除,有两种方式,一种是要求该Activity结束,一种是直接被杀掉。
3.3.2 Activity的生命周期
本节介绍Activity生命周期和回调方法。
1.Android的回调机制
一个通用的程序架构具有完成整个应用的流程和功能,但在某个特定点需要一段业务相关的代码进行处理,例如Activity的onCreate()、onPause()和onStop()等回调方法,开发人员可以选择性地重写这些方法,通用的程序架构就会回调该方法进行相关的业务处理。
2.Activity的回调方法
Activity的回调方法有onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy()、onSaveInstanceState()、onRestoreInstanceState()等,下面分别介绍。
(1)onCreate(Bundle):
创建Activity时被回调,该方法只会被调用一次。如果Activity之前是被冻结状态,其状态由Bundle提供,接收参数为null或由onSaveInstanceState()方法保存的状态信息。其后调用onStart()或onRestart()方法。
(2)onStart():
启动Activity时被回调,当Activity对用户即将可见时被调用。
(3)onResume():
恢复Activity时被回调,当Activity可以开始与用户进行交互之前被调用。
(4)onPause():
暂停Activity时被回调,活动将进入后台时会运行该方法,当系统将要启动另一个Activity之前被调用。
(5)onStop():
停止Activity时被回调,当Activity不再为用户可见时被调用。
(6)onRestart():
重新启动Activity时被回调,在再次启动之前被调用。
(7)onDestroy():
销毁Activity时被回调,在Activity销毁前被调用。
(8)onSaveInstanceState(Bundle):
回调该方法让活动可以保存每个实例的状态。
(9)onRestoreInstanceState(Bundle):
回调onSaveInstanceState()方法保存的状态来重新初始化某个活动时调用该方法,其后紧跟的方法是onResume()。
3.Activity的生命周期
Activity的生命周期如图3.1所示。
Activity的生命周期可分为完全生命周期、可视生命周期和活动生命周期,每种生命周期中包含不同的回调方法,如图3.2所示。
1)完全生命周期
完全生命周期是从Activity创建到销毁的全部过程,从调用onCreate()开始到onDestroy()结束。开发人员通常在onCreate()中初始化Activity所能使用的全局资源和状态,并在onDestroy()中释放这些资源。在一些极端的情况下,Android系统不调用onDestroy(),直接终止进程。

图3.1 Activity生命周期

图3.2 Activity生命周期分类
2)可视生命周期
可视生命周期是Activity在界面上从可见到不可见的过程,从调用onStart()开始到onStop()结束。onStart()一般用来初始化或启动与更新界面相关的资源,onStop()一般用来暂停或停止一切与更新用户界面相关的线程、计时器和服务。onRestart()在onSart()前被调用,用来在Activity从不可见变为可见的过程中,进行一些特定的处理过程。onStart()和onStop()会被多次调用,使Activity不断地从可见到不可见,再从不可见到可见。
3)活动生命周期
活动生命周期是Activity在屏幕的最上层,并能够与用户交互的阶段,从调用onResume()开始到onPause()结束。在Activity的状态变换过程中onResume()和onPause()经常被调用,因此这两个回调方法中应使用简单、高效的轻量级代码。
【例3.1】 为了更好地理解Activity生命周期和Android的回调机制,通过LifeCycle示例的演示进行说明和分析。
【解题思路】
通过在生命周期回调方法中添加“日志点”的方法进行调试,程序的运行结果将会显示在LogCat中。为了使显示结果易于观察和分析,在LogCat中设置过滤器LifeTest,过滤方法选择by Log Tag,过滤关键字为ActivityLifeCycle。
【开发步骤和程序分析】
(1)在Eclipse中创建一个LifeCycle应用项目,包名为com.application.lifecycle。
(2)在src/com.application.lifecycle包下的lifecycle.java文件中,加载main.xml布局文件,在生命周期回调方法中添加“日志点”。
在该文件中编辑代码如下:



【运行结果】
在Eclipse中启动模拟器,然后运行项目LifeCycle,运行结果如图3.3所示。

图3.3 LifeCycle应用项目界面
(1)演示完全生命周期。
启动项目LifeCycle后,单击项目界面中的“结束”按钮,LogCat输出结果如图3.4所示。

图3.4 Activity完全生命周期回调方法次序
由图3.4可看出,回调方法的调用顺序如下:(1)onCreate→(2)onStart→(4)onResume→(7)onPause→(8)onStop→(9)onDestroy。
启动Activity时,系统首先调用onCreate()分配资源,再调用onStart()将Activity显示在屏幕上,然后调用onResume()获取焦点,能够与用户进行交互,此时用户能够正常使用这个Android项目。
当用户单击“结束”按钮时,系统相继调用onPause()、onStop()和onDestroy(),释放资源并销毁进程。
(2)演示可视生命周期。
正常启动LifeCycle,再通过“Call键”(拨号键)启动内置的拨号程序,然后通过“Back键”(回退键)退出拨号程序,LifeCycle重新显示在屏幕上,LogCat输出结果如图3.5所示。

图3.5 Activity可视生命周期回调方法次序
由图3.5可看出,回调方法的调用顺序:(1)onCreate→(2)onStart→(4)onResume→(7)onPause→(5)onSaveInstanceState→(8)onStop→(6)onRestart→(2)onStart→(4)onResume。
Activity启动时,回调方法的调用顺序仍为(1)onCreate→(2)onStart→(4)onResume。
当按下“Call键”(拨号键)时,内置拨号程序被启动,原有的Activity被覆盖,系统首先调用onPause(),再调用onSaveInstanceState()保存Activity状态,最后调用onStop()停止对不可见的Activity的更新。
当按下“Back键”(回退键)时,退出拨号程序,系统调用onRestart()恢复界面上需要更新的信息,再调用onStart()和onResume()重新显示Activity,能够与用户进行交互。