• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android activity的四种启动模式

武飞扬头像
happy_to_study
帮助1

概述

Android 的应用之间可以很方便地进行调用,也就是说A 应用可以很方便地在自己的代码中方便地打开B应用的某个页面。
在A 应用中打开B应用中的ActivityB 代码如下:

B的包名为:com.test.b

                Intent intent = new Intent();
                ComponentName componentName = new ComponentName(
                        "com.test.b",
                        "com.test.b.ActivityB");
                intent.setComponent(componentName);
                try {
                    startActivity(intent);
                } catch (Exception e) {
                    e.printStackTrace();
                }

我们知道 activity 有四种启动模式: standard, singleTop, singleTask, singleInstance,
可以直接在A androidManifest.xml中指定:android:launchMode=“xxx”

<activity
            android:name=".ActivityB"
            android:launchMode="singleTop"
            android:exported="true"
        />

这样以来,我们不禁有以下疑问:

  • 打开的ActivityB 和A 在同一个进程吗?
  • 打开的ActivityB 和A 在同一个activity 任务栈中吗?
  • 不同的launchMode 下,上述问题的答案一样吗?

不同launchMode的区别

下面为A应用中启动B应用中的ActivityB,B的ActivityB 不同launchMode下的区别

standard(默认)

standard 模式也是默认模式(不指定就为默认)。

  • 关于进程:
    系统会先检查B 应用是否有启动进程,如果没有会启动一个新的进程来运行ActivityB;否则,用已经存在的B进程运行ActivityB。
  • 关于activity栈
    ActivityB 会在A应用当前的activity 所在的栈顶。

可以使用这条命令看activity栈
add shell dumpsys activity | grep -Ei “activityRecord”

  • 关于activity 的创建
    每次startActivity 都创建一个新的activity

singleTop

  • 关于进程
    和standard一样
  • 关于activity栈
    和standard一样,会在A应用的activity栈中
  • 关于activity的创建
    如果ActivityB位于当前栈的栈顶,则直接回调onNewIntent() 方法,而不是创建新的实例; 否则和standard 一样。
    所以又叫做栈顶复用模式

singleTask

  • 关于进程
    和standard 一样
  • 关于activity 栈
    在创建之前,先检查 系统中是否存在task 的affinity 属性等于ActivityB 的taskAffinity , 如果不存在,就创建一个新的任务栈;如果存在,会检查该任务栈中是否有 ActivityB 的实例,如果没有,则创建新的,否则,将 该task 中ActivityB 上面的activity 弹出,直到ActivityB 位于栈顶。
  • 关于activity 的创建
    见上一条

所以singleTask 模式在目标activity已经创建过的情况下具有清栈顶的作用。

singleInstance

  • 关于进程
    和standard一样
  • 关于Activity栈
    独享一个单独的栈,即便B应用当前也有自己的栈了,也会为ActivityB单独创建一个新的task栈;
  • 关于Activity的创建
    由于独享栈,其实就是全局单例。如果没有创建过,则创建新的;否则,调用onNewIntent。

总结

  • A 和 ActivityB不在同一个进程
  • standrad 和singleTop模式下,ActivityB 和启动它的activity 位于同一个栈;二者的区别为singleTop 会复用栈顶的ActivityB的实例(如果栈顶有的话)
  • singleTask 和singleInstance 下,ActivityB 和A 的activity不在同一个栈;二者的区别是:
    singleInstance 独享一个栈, singleTask在目标Activity存在的情况下具有清栈顶的作用。

singleTop用于不允许连续重复创建页面的场合;
singleTask 一般用于首页;
singleInstance 一般用于 桌面,通讯录,银行app登录页面等对安全、隐私等有特殊要求的场合。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgciiib
系列文章
更多 icon
同类精品
更多 icon
继续加载