【Activity】Activity的启动模式:SingleTask

【Activity】Activity的启动模式:SingleTask目录1.概述2.详细过程2.1启动MainActivity2.1.1生命周期2.1.2Activity栈2.2MainActivity中启动SecondActivity2.2.1生命周期2.2.2Activity栈2.3SecondActivity中启动MainActivity2.3.1生命周期2.3.2Activity栈2.4…

大家好,又见面了,我是你们的朋友全栈君。

目录

1. 概述

2. 详细过程

2.1 启动MainActivity

2.1.1 生命周期

2.1.2 Activity栈

2.2 MainActivity中启动SecondActivity

2.2.1 生命周期

2.2.2 Activity栈

2.3 SecondActivity中启动MainActivity

2.3.1 生命周期

2.3.2 Activity栈

2.4 MainActivity中启动SecondActivity

2.4.1 生命周期

2.4.2 Activity栈

3. 总结

4. Reference


1. 概述

总是看到Activity的四种启动模式:Standard,SingleTask,SingleTop,SingleInstance,而且都是借助于官方文档理解的。但是最近在写Demo测试这几种启动模式的特点与区别的时候,发现与官方文档有不一致的地方。本篇文章主要讲解的是SingleTask这种LaunchMode。

在Android官方文档中,对“singleTask”模式解释的是:The system creates a new task and instaniates the activity at the root of the new task。

但是在写demo测试的时候,发现这个说法是不准确的。这句话成立的条件是,要启动的Activity的affinity是唯一的,即当前所有的任务中没有与该affinity相同的任务。

Demo中包含两个Activity,Activity的LaunchMode:

MainActivity-Standard
SecondActivity- SingleTask

步骤:

  1. 启动MainActivity;
  2. MainActivity中启动SecondActivity
  3. SecondActivity中启动MainActivity
  4. MainActivity中启动SecondActivity

使用命令:“dumpsys activity activities“,dump Activity栈的信息。


2. 详细过程

2.1 启动MainActivity

2.1.1 生命周期

2019-02-25 08:05:36.334 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:05:36.528 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:05:36.531 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@f6993c1

2.1.2 Activity栈

TaskRecord{832ddac #32 A=com.maureen.testtwoactivity U=0 StackId=1 sz=1}
        Run #0: ActivityRecord{2de94c6 u0 com.maureen.testtwoactivity/.MainActivity t32}

2.2 MainActivity中启动SecondActivity

2.2.1 生命周期

2019-02-25 08:06:22.582 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:06:22.669 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onCreate:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:06:22.772 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:06:22.776 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:06:23.520 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:06:23.522 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@f6993c1

2.2.2 Activity栈

TaskRecord{832ddac #32 A=com.maureen.testtwoactivity U=0 StackId=1 sz=2}
        Run #1: ActivityRecord{8be2cd6 u0 com.maureen.testtwoactivity/.SecondActivity t32}
        Run #0: ActivityRecord{2de94c6 u0 com.maureen.testtwoactivity/.MainActivity t32}

2.3 SecondActivity中启动MainActivity

2.3.1 生命周期

2019-02-25 08:07:46.098 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onPause:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:07:46.165 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:07:46.272 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:07:46.277 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:07:47.006 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStop:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:07:47.008 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26

2.3.2 Activity栈

TaskRecord{832ddac #32 A=com.maureen.testtwoactivity U=0 StackId=1 sz=3}
        Run #2: ActivityRecord{3e6e847 u0 com.maureen.testtwoactivity/.MainActivity t32}
        Run #1: ActivityRecord{8be2cd6 u0 com.maureen.testtwoactivity/.SecondActivity t32}
        Run #0: ActivityRecord{2de94c6 u0 com.maureen.testtwoactivity/.MainActivity t32}

2.4 MainActivity中启动SecondActivity

2.4.1 生命周期

2019-02-25 08:08:51.142 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:08:51.174 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onNewIntent:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:08:51.182 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:08:51.185 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:08:51.898 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:08:51.902 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onDestroy:this=com.maureen.testtwoactivity.MainActivity@24103c8

2.4.2 Activity栈

TaskRecord{8ea7a0a #2 A=com.android.car.carlauncher U=0 StackId=0 sz=1}
        Run #0: ActivityRecord{d99cab7 u0 com.android.car.carlauncher/.CarLauncher t2}

3. 总结

  1. “singleTask”模式启动的Activity,在启动时,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务是否存在:如果存在,则在该任务中启动;如果不存在,则会在新任务中启动。因此,如果想要设置“singleTask”启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity的值。(这句话更加具体的一个例子是:App1中启动了一个taskAffinity为com.xx.test的ActivityA,App2中要启动一个taskAffinity为com.xx.test的ActivityB,那么ActivityB会在ActivityA所在的任务中启动)。
  2. 如果设置了“singleTask”启动模式的Activity不是在新的任务中启动的,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,会调用该实例的onNewIntent,并且会把位于这个Activity实例上面的Activit全部结束掉,最终这个Activity实例会位于任务的堆栈顶端。

4. Reference

部分内容参考自“singleTask”模式 切换到新的栈中

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153241.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月26日 下午12:16
下一篇 2022年6月26日 下午12:16


相关推荐

  • python矩阵相乘

    python矩阵相乘矩阵相乘 np dot num data values feature importances

    2026年3月18日
    2
  • java jpa是什么_jpa是什么框架?jpa是什么意思?

    java jpa是什么_jpa是什么框架?jpa是什么意思?你了解jpa吗?很多人表示,对于jpa是一个什么框架并不是很了解,那么下面就一起通过下面的文章内容来了解一下jpa吧!jpa其实就是JavaPersistenceAPI的简称,它的中文名字是Java持久层API,是JDK5.0注解或者XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库当中。JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致,总…

    2022年6月29日
    34
  • 2025 国产大模型排名:豆包大模型与文心一言领衔

    2025 国产大模型排名:豆包大模型与文心一言领衔

    2026年3月12日
    3
  • 2020年Android面试题汇总(初级)-简书_android经典面试题

    2020年Android面试题汇总(初级)-简书_android经典面试题Android面试题及答案(2022年最新Android面试题大全带答案),发现网上很多Android面试题整理都没有答案,所以花了很长时间搜集,本套Android面试题大全,Android面试题大汇总,有大量经典的Android面试题以及答案,包含Android语言常见面试题、Android工程师高级面试题及一些大厂Android开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习!这套Android面试题汇总大全,希望对大家有帮助哈~此面试题合集分为9个部分:Java基础、And

    2022年8月28日
    5
  • 文本聚类简单实现_文本聚类分析

    文本聚类简单实现_文本聚类分析引用:CoreConcepts—gensim<<自然语言处理入门>>一、简介文本聚类(textclustering,也称文档聚类或documentclustering)指的是对文档进行的聚类分析,被广泛用于文本挖掘和信息检索领域。最初文本聚类仅用于文本归档,后来人们又挖掘出了许多新用途,比如改善搜索结果、生成同义词,等等。在文本的预处理中,聚类同样可以发挥作用比如在标注语料之前,通常需要从…

    2025年6月28日
    4
  • 理解class.forName()

    理解class.forName()

    2021年12月7日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号