文章目录
- 生命周期
- 返回栈
- Activity状态
- 生命周期方法
- 启动模式
- standard模式
- singleTask模式
- singleTop模式
- singleInstance模式
- singleInstancePerTask模式
- 配置方式
生命周期
返回栈
每个Activity
的状态由它在Activity
栈(又叫“回退栈back stack
”)中的位置决定,是所有当前正在运行的Activity
的后进先出集合。
当一个新的Activity
启动时,它会变为活动状态并被压入栈顶。
如果用户使用Back
按钮进行回退,或者前台Activiy
以其他方式关闭了,那么栈中的下一个Activity
就会并外于活动状态。
Activity状态
-
活动状态
当 Activity 位于栈顶时,它对于用户输入而言是一个可见且拥有焦点的前台 Activity。Android会不惜一切代价让它存活下来,甚至会根据需要杀死栈中更底部的 Activity 所依附的应用,以保障该Activity 所需的资源。当另一个 Activity 变为活动状态时,这个 Activity 就会被暂停,当变为不可见时,它就会被停止。 -
暂停状态
在某些情况下,Activity虽然可见,但它并没有获得焦点。这时,它就处于暂停状态。当应用在多窗口环境中使用时,也可能会达到这种状态。在此环境中,可能会出现多个应用同时可见,但只有用户最后一次与之交互Activity 才会被认为处于活动状态。
当暂停时,Activity 还被视为是活动的,但它不能再接收到用户的各种输入事件。甚至在极端的情况下Android还会杀死暂停状态下的 Activity来恢复处于活动状态的 Activity 所需要的资源。当一个 Activity 变得完全不可见时,它就会处于停止状态,而所有 Activity 在进入停止状态之前都要经历暂停状态以进行转换。
-
停止状态
当一个Activity不可见时,它就进入了停止状态。此时Activity 将保存在内存中,并保留所有的获态信息;然而,当系统需要内存时,它也就成可能被终止的候选者。 -
不活动状态
一个 Activity 在被杀死之后到被启动之前,都处于不活动状态。不活动状态的Activity 已经从栈中移除,需要重新启动才能再次显示和使用它们。
生命周期方法
三种生存期,七个回调方法
- onCreate
Activity
第一次被创建时调用,整个Activity
生命周期只会调用一次。
初始化Activity
并填充UI布局
- onStart
Activity
即将变得可见时调用,但不能交互
- onResume
Activity
将开始与用户进行交互时调用。
- onPause
系统准备开始另一个 Activity
时调用。此时 Activity
仍然可见,但失去焦点。
- onStop
Activity
不再可见时调用
- onDestory
Activity
被销毁前调用。可能由系统或用户主动销毁 Activity
。
- onRestart
Activity
从停止状态重新启动前调用。
示例:
第一次启动应用程序:oncreate()
->onStart()
->onResume()
->
切到后台:onPause()
->onStop()
->
再次打开:onRestart()
->onStart()
->onResume()
->
切到后台并删除:onPause()
->onStop()
->onDestory()
启动模式
standard模式
默认模式:标准模式是默认的启动模式,如果你在 AndroidManifest.xml
中没有指定启动模式,那么默认使用标准模式。
每次启动新实例:每次启动 Activity
时,系统都会创建该 Activity
的新实例,并将其放在任务堆栈的顶部。
无重用机制:如果一个 Activity
已经存在,并且你再次启动它,系统不会重用已经存在的实例,而是会创建一个新的实例。
singleTask模式
当跳到一个SingleTask
模式的Activity
时:
-
判断当前任务栈内是否已经有该
Activity
-
如果没有,则新建一个,并正常入栈
-
如果已经有了,则把该
Activity
上面的全部弹出,将该Activity
暴露在最上面
singleTop模式
栈顶复用
当跳到一个SingleTop
模式的Actigity
时:
判断当前任务栈的栈顶是否是该Activity
- 如果栈顶不是,则新建一个,并正常入栈
- 如果栈顶是,直接复用栈顶的
Activity
,不新建Activity
singleInstance模式
当跳到一个singleInstance
模式的Activity
时:
-
如果发现某任务栈已经有该
Activity
时,直接复用,不新建 -
如果还没有,则直接新开辟一个栈,新建该
Activity
入栈。专门盛放该Activity
独享一个任务栈
singleInstancePerTask模式
-
singleInstancePerTask
可以看作是singleTask
的一个变种。 -
它允许同一个 Activity 在多个任务(Task)中有多个实例,但每个实例都位于其所在任务的根位置。
-
结合
Intent.FLAG_ACTIVITY_MULTIPLE_TASK
和Intent.FLAG_ACTIVITY_NEW_DOCUMENT
,每次启动这个 Activity 都会创建一个新的任务,并将该 Activity 作为任务的根 Activity。 -
当你需要同一个 Activity 在多个任务中存在多个独立的实例时,可以使用
singleInstancePerTask
。每次启动该 Activity 都会创建一个新的任务,这些任务彼此独立,互不影响
配置方式
配置启动模式方式:
- 在
AndroidManifest.xml
文件中配置
不写默认standard模式
<activity android:name=".MainActivity"
android:launchMode="singleInstance">
</activity>
<activity android:name=".MainActivity"
android:launchMode="singleTop">
</activity>
<activity android:name=".MainActivity"
android:launchMode="singleTask">
</activity>
- 通过 Intent 设置
所有启动activityB
的intent
都需要设置,只对从activityA
跳转到activityB
这次生效
- singleTask
// 为ActivityA设置singleTask启动模式
Intent intent = new Intent(this, ActivityA.class);
// 添加FLAG_ACTIVITY_CLEAR_TOP标志
// 这个标志的作用是,如果ActivityA已经在任务栈中存在,那么将栈中位于ActivityA之上的所有Activity全部出栈,使ActivityA成为栈顶Activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// 添加FLAG_ACTIVITY_NEW_TASK标志
// 这个标志表示将会为这个Intent启动一个新的任务栈。如果这个Intent的targetActivity属于一个已经存在的任务栈
// 那么将会把这个targetActivity及其所有子Activity全部移动到一个新的任务栈中
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
- singleTop
Intent intent = new Intent(this, ActivityA.class);
// 添加FLAG_ACTIVITY_SINGLE_TOP标志
// 当这个标志被设置后,如果ActivityA已经在任务栈的顶部,那么不会创建新的实例
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
- SingleInstance没有对应的Flag
总结:
启动模式 | 描述 | Intent 标志位 | 配置方式 |
---|---|---|---|
standard | 每次启动都会创建新实例。 | 无 | AndroidManifest.xml |
singleTop | 栈顶复用 | Intent.FLAG_ACTIVITY_SINGLE_TOP | AndroidManifest.xml 或 Intent |
singleTask | 栈中复用 | Intent.FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_CLEAR_TOP | AndroidManifest.xml 或 Intent |
singleInstance | 独立任务栈 | 无 | AndroidManifest.xml 配置 |
singleInstancePerTask | 每个任务的根 Activity,支持多个实例 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK Intent.FLAG_ACTIVITY_NEW_DOCUMENT | AndroidManifest.xml 配置 |
感谢您的阅读
如有错误烦请指正
参考:
- 18-认识Activity的启动模式_哔哩哔哩_bilibili
- 【Android】Activity的启动模式_在代码中指定启动另外一个activity的启动模式-CSDN博客
- 《Android 高级编程(第4版)》
- 《第一行代码》