【Android】活动的生命周期与启动模式
活动的生命周期
返回栈
返回栈(Back Stack)是Android操作系统中用于管理用户在应用中导航历史的一种数据结构。它允许用户通过按下硬件返回键或调用系统返回功能来回到之前的操作步骤。以下是返回栈的一些关键特点和行为:
基本概念
- 栈结构:返回栈遵循后进先出(LIFO)的原则,即最后加入栈的
Activity
会最先被移除。 - 导航:当用户启动一个新的
Activity
,当前的Activity
被推入返回栈。用户可以通过返回操作回到前一个Activity
。
生命周期与返回栈的关系
- 入栈**(Pushing)**:当一个新的
Activity
被启动时,如果android:launchMode
不是singleTask
或singleInstance
,当前Activity
将被推入返回栈。 - 出栈**(Popping)**:当用户按下返回键,当前
Activity
将从返回栈中弹出,用户将返回到前一个Activity
。 - 栈顶(Top of Stack):返回栈的顶部是当前在屏幕上显示的
Activity
。
返回栈的操作
- 显式意图(Explicit Intent):使用显式意图启动
Activity
时,可以通过设置Intent
的标志如FLAG_ACTIVITY_CLEAR_TOP
来影响返回栈的行为。 - 隐式意图(Implicit Intent):使用隐式意图时,系统可能会启动一个新的
Activity
栈。 - finish() 方法:调用当前
Activity
的finish()
方法会将该Activity
从返回栈中移除,用户将返回到返回栈的上一个Activity
。 - 清空返回栈:使用
FLAG_ACTIVITY_CLEAR_TOP
标志可以清空当前Activity
之上的所有Activity
,并将当前Activity
作为新的栈顶。
返回栈的配置
- AndroidManifest.xml:在应用的清单文件中,可以通过设置
Activity
的android:launchMode
属性来改变返回栈的行为。例如,singleTop
、singleTask
、singleInstance
等模式。 - Intent 标志:通过设置
Intent
的标志,如FLAG_ACTIVITY_CLEAR_TOP
、FLAG_ACTIVITY_SINGLE_TOP
等,可以控制Activity
启动时返回栈的表现。
活动状态
运行状态(Resumed)
- 这是
Activity
的活跃状态,用户可以与之交互。 - 在这个状态下,
Activity
完全可见并处于交互模式。 - 当
Activity
从其他状态转换到运行状态时,会调用onResume()
生命周期方法。
暂停状态(Paused)
- 当
Activity
部分被遮挡,但仍可见时,它进入暂停状态。 - 例如,当一个新的
Activity
启动并覆盖当前Activity
的部分视图,或者一个对话框弹出时。 - 在这个状态下,
Activity
仍然可见,但不在交互模式下。 - 系统会调用
onPause()
方法,这是一个保存状态和停止动画的好地方。
停止状态(Stopped)
- 当
Activity
完全不可见时,它进入停止状态。 - 这可能发生在另一个
Activity
完全覆盖它,或者当用户按返回键离开当前Activity
时。 onStop()
方法会被调用,此时应该释放不需要的资源,如传感器、摄像头等。
销毁状态(Destroyed)
- 当
Activity
被系统销毁时,它进入销毁状态。 - 这可能是因为内存不足,系统需要杀掉进程,或者
Activity
被明确调用finish()
方法。 - 在销毁之前,
onDestroy()
方法会被调用,这是一个清理资源的地方,如广播接收器、注册的内容观察者等。
活动的生存期
onCreate(Bundle savedInstanceState)
- 作用:当
Activity
第一次创建时调用,是进行初始化设置的地方。 - 参数:
Bundle savedInstanceState
包含了先前Activity
保存的状态(如果有的话)。当Activity
被系统销毁并重新创建时,这个参数会传递之前保存的状态。 - 任务:在这里设置
Activity
的布局(通过调用setContentView(int layoutResID)
),初始化变量,恢复状态,以及执行一次性的设置。
onStart()
- 作用:当
Activity
变得可见时调用,但此时Activity
可能还没有获得焦点。 - 特点:
Activity
已经与用户交互,但可能被其他透明的Activity
覆盖。 - 任务:在这里启动需要的资源,如注册广播接收器,开始动画等。
onRestart()
- 作用:当
Activity
从停止状态恢复时调用。 - 特点:通常发生在用户导航离开
Activity
后再次返回。 - 任务:在这里可以重新初始化数据,恢复之前的状态,或者重新获取资源。
onResume()
- 作用:当
Activity
进入前台并开始与用户交互时调用。 - 特点:
Activity
现在是可见的并且是焦点Activity
。 - 任务:在这里执行动画的开始,获取用户输入,或者执行定时任务。
onPause()
- 作用:当
Activity
部分被遮挡或不再是焦点时调用。 - 特点:
Activity
可能仍然可见,但用户不能与之交互。 - 任务:在这里应该停止动画,节省资源,保存任何关键状态,因为
Activity
可能很快被系统销毁。
onStop()
- 作用:当
Activity
不再可见时调用。 - 特点:
Activity
可能被另一个Activity
覆盖,或者用户按了返回键。 - 任务:在这里释放不需要的资源,如传感器、摄像头等,取消动画,停止播放音频等。
onDestroy()
- 作用:当
Activity
被销毁时调用。 - 特点:这是
Activity
生命周期中的最后一个回调。 - 任务:在这里释放所有资源,如广播接收器、注册的内容观察者、定时器等。确保在
Activity
销毁时没有遗留的系统资源。
活动的启动模式
- standard
- 这是默认的启动模式。
- 每次启动
Activity
时,都会创建一个新的实例,并将其放入任务的返回栈中。 - 如果用户导航离开并再次返回,系统会重新创建
Activity
的新实例。
- singleTop
- 当使用
singleTop
启动模式启动Activity
时,如果它已经位于返回栈的栈顶,系统不会创建新的实例。 - 如果
Activity
不在栈顶,或者栈顶的实例不是通过隐式意图启动的,系统将创建一个新的实例。
- 当使用
- singleTask
singleTask
模式确保任务中只有一个特定Activity
的实例存在。- 当启动
Activity
时,如果任务中已经存在该Activity
的实例,系统不会创建新的实例,而是将这个实例上面的所有Activity
从返回栈中移除,并将这个实例带到栈顶。 - 这确保了
Activity
总是在任务的根位置。
- singleInstance
singleInstance
模式确保在整个系统中只有一个Activity
的实例存在。- 当启动
Activity
时,系统会创建一个新的任务来启动这个Activity
,并且这个Activity
总是位于任务的根位置。
tance模式确保在整个系统中只有一个
Activity` 的实例存在。 - 当启动
Activity
时,系统会创建一个新的任务来启动这个Activity
,并且这个Activity
总是位于任务的根位置。 - 任何试图启动这个
Activity
的尝试都会重用现有的实例,并且不会创建新实例。