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

生命周期

返回栈

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

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

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

image-20240725093102099

Activity状态

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

  2. 暂停状态

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

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

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

  4. 不活动状态

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

生命周期方法

IMG_20240725_092516

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

  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 已经存在,并且你再次启动它,系统不会重用已经存在的实例,而是会创建一个新的实例。
image-20240725100208824

singleTask模式

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

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

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

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

image-20240725100245068

singleTop模式

栈顶复用

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

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

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

在这里插入图片描述

singleInstance模式

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

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

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

    独享一个任务栈

image-20240725101704340

image-20240725101735944

singleInstancePerTask模式

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

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

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

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

配置方式

配置启动模式方式:

  1. 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>
  1. 通过 Intent 设置

所有启动activityBintent都需要设置,只对从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_TOPAndroidManifest.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_DOCUMENTAndroidManifest.xml 配置


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


参考:

  1. 18-认识Activity的启动模式_哔哩哔哩_bilibili
  2. 【Android】Activity的启动模式_在代码中指定启动另外一个activity的启动模式-CSDN博客
  3. 《Android 高级编程(第4版)》
  4. 《第一行代码》
  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值