【Android】Activity生命周期与五种启动模式

文章目录

生命周期

返回栈

每个Activity的状态由它在Activity栈(又叫"回退栈back stack")中的位置决定,是所有当前正在运行的Activity的后进先出集合。

当一个新的Activity启动时,它会变为活动状态并被压入栈顶。

如果用户使用Back按钮进行回退,或者前台Activiy以其他方式关闭了,那么栈中的下一个Activity就会并外于活动状态。

Activity状态

  1. 活动状态

    当 Activity 位于栈顶时,它对于用户输入而言是一个可见且拥有焦点的前台 Activity。Android会不惜一切代价让它存活下来,甚至会根据需要杀死栈中更底部的 Activity 所依附的应用,以保障该Activity 所需的资源。当另一个 Activity 变为活动状态时,这个 Activity 就会被暂停,当变为不可见时,它就会被停止。

  2. 暂停状态

    在某些情况下,Activity虽然可见,但它并没有获得焦点。这时,它就处于暂停状态。当应用在多窗口环境中使用时,也可能会达到这种状态。在此环境中,可能会出现多个应用同时可见,但只有用户最后一次与之交互Activity 才会被认为处于活动状态。

    当暂停时,Activity 还被视为是活动的,但它不能再接收到用户的各种输入事件。甚至在极端的情况下Android还会杀死暂停状态下的 Activity来恢复处于活动状态的 Activity 所需要的资源。当一个 Activity 变得完全不可见时,它就会处于停止状态,而所有 Activity 在进入停止状态之前都要经历暂停状态以进行转换。

  3. 停止状态

    当一个Activity不可见时,它就进入了停止状态。此时Activity 将保存在内存中,并保留所有的获态信息;然而,当系统需要内存时,它也就成可能被终止的候选者。

  4. 不活动状态

    一个 Activity 在被杀死之后到被启动之前,都处于不活动状态。不活动状态的Activity 已经从栈中移除,需要重新启动才能再次显示和使用它们。

生命周期方法

三种生存期,七个回调方法

  1. onCreate

Activity第一次被创建时调用,整个Activity生命周期只会调用一次。

初始化Activity并填充UI布局

  1. onStart

Activity 即将变得可见时调用,但不能交互

  1. onResume

Activity 将开始与用户进行交互时调用。

  1. onPause

系统准备开始另一个 Activity 时调用。此时 Activity 仍然可见,但失去焦点。

  1. onStop

Activity 不再可见时调用

  1. onDestory

Activity 被销毁前调用。可能由系统或用户主动销毁 Activity

  1. onRestart

Activity 从停止状态重新启动前调用。

示例:

第一次启动应用程序:oncreate()->onStart()->onResume()->

切到后台:onPause()->onStop()->

再次打开:onRestart()->onStart()->onResume()->

切到后台并删除:onPause()->onStop()->onDestory()

启动模式

standard模式

默认模式 :标准模式是默认的启动模式,如果你在 AndroidManifest.xml 中没有指定启动模式,那么默认使用标准模式。

每次启动新实例 :每次启动 Activity 时,系统都会创建该 Activity 的新实例,并将其放在任务堆栈的顶部。

无重用机制 :如果一个 Activity 已经存在,并且你再次启动它,系统不会重用已经存在的实例,而是会创建一个新的实例。

singleTask模式

当跳到一个SingleTask模式的Activity时:

  1. 判断当前任务栈内是否已经有该Activity

  2. 如果没有,则新建一个,并正常入栈

  3. 如果已经有了,则把该Activity上面的全部弹出,将该Activity暴露在最上面

singleTop模式

栈顶复用

当跳到一个SingleTop模式的Actigity时:

判断当前任务栈的栈顶是否是该Activity

  1. 如果栈顶不是,则新建一个,并正常入栈
  2. 如果栈顶是,直接复用栈顶的Activity,不新建Activity

singleInstance模式

当跳到一个singleInstance模式的Activity时:

  1. 如果发现某任务栈已经有该Activity时,直接复用,不新建

  2. 如果还没有,则直接新开辟一个栈,新建该Activity入栈。专门盛放该Activity

    ++独享一个任务栈++

singleInstancePerTask模式

  • singleInstancePerTask 可以看作是 singleTask 的一个变种。

  • 它允许同一个 Activity 在多个任务(Task)中有多个实例,但每个实例都位于其所在任务的根位置。

  • 结合 Intent.FLAG_ACTIVITY_MULTIPLE_TASKIntent.FLAG_ACTIVITY_NEW_DOCUMENT,每次启动这个 Activity 都会创建一个新的任务,并将该 Activity 作为任务的根 Activity。

  • 当你需要同一个 Activity 在多个任务中存在多个独立的实例时,可以使用 singleInstancePerTask。每次启动该 Activity 都会创建一个新的任务,这些任务彼此独立,互不影响

配置方式

配置启动模式方式:

  1. AndroidManifest.xml 文件中配置

不写默认standard模式

xml 复制代码
<activity android:name=".MainActivity"
    android:launchMode="singleInstance">
</activity>
xml 复制代码
<activity android:name=".MainActivity"
    android:launchMode="singleTop">
</activity>
xml 复制代码
<activity android:name=".MainActivity"
    android:launchMode="singleTask">
</activity>
  1. 通过 Intent 设置

所有启动activityBintent都需要设置,只对从activityA跳转到activityB这次生效

  • singleTask
java 复制代码
        // 为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
java 复制代码
        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.xmlIntent
singleTask 栈中复用 Intent.FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_CLEAR_TOP AndroidManifest.xmlIntent
singleInstance 独立任务栈 AndroidManifest.xml 配置
singleInstancePerTask 每个任务的根 Activity,支持多个实例 Intent.FLAG_ACTIVITY_MULTIPLE_TASK Intent.FLAG_ACTIVITY_NEW_DOCUMENT AndroidManifest.xml 配置


感谢您的阅读
如有错误烦请指正


参考:

  1. 18-认识Activity的启动模式_哔哩哔哩_bilibili
  2. 【Android】Activity的启动模式_在代码中指定启动另外一个activity的启动模式-CSDN博客
  3. 《Android 高级编程(第4版)》
  4. 《第一行代码》
相关推荐
Charles Ray4 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码5 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文6 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people10 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
qmx_071 小时前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战1 小时前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
Dingdangr3 小时前
Android中的Intent的作用
android