Activity启动模式singleTask的理解

Activity启动模式singleTask的理解1.Activity启动模式singleTask的理解2.Task与Activity栈3.singleTask设置方式4.singleTask的意义(作用)4.1.举例说明4.2.例子14.3.例子24.4.小结5.taskAffinity属性5.1.配置方式5.2.意义(作用)5.3.举例5.4.回退顺序5.5.总结1.Activity启动模式singleTask的理解2.Task与Activity栈Task是一些Acti..

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

1. Activity启动模式singleTask的理解

2. Task与Activity栈

Task是一些Activity的集合,以Activity栈的形式存放。因此,Task是概念上的,Activity栈是实体上的。

可以说,新启动了一个Task就是新建了一个Activity栈,来存放这个Task内的Activity。

3. singleTask设置方式

  • manifest文件
    在activity节点里添加属性:
<activity
    android:name="com.example.test.SecondActivity"
    android:launchMode="singleTask"
/>

  • intent设置FLAG
Intent intent = new Intent(this, SecondActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

4. singleTask的意义(作用)

把一个activity启动模式设置为为singleTask,只是意味着framework在启动该activity时把它标识为可在一个新任务中启动,至于是否在一个新任务中启动,那可不一定了!是需要条件的,什么条件呢?请看下文分解~

4.1. 举例说明

4.2. 例子1

假设下面的跳转关系:

MainActivity -> SecondeActivity -> ThirdActivity

其中,SecondeActivity被设置了singleTask的启动模式,MainActivity和ThirdActivity都不做任何操作,保持默认,即standard模式

那么跳到ThirdActivity后,当前的Activity栈情况从顶到底部是:

ThirdActivity、SecondeActivity、MainActivity

也就是说依然按照正常压栈的顺序,和standard模式一样。并不是按照谷歌官方解释的,容易误解为新建了一个Task,并用新的栈存放SecondeActivity。这是误解。

那么,真的和standard模式一样吗?

还是有不同的,不然弄这个模式干嘛。

不同之处,用下面的例子说明:

4.3. 例子2

假设下面的跳转关系:

MainActivity -> SecondeActivity -> ThirdActivity -> ForthActivity ->SecondeActivity

其中,SecondeActivity被设置了singleTask的启动模式,其余Activity都不做任何操作,保持默认,即standard模式

那么跳到SecondeActivity后,当前的Activity栈情况从顶到底部是:

SecondeActivity、MainActivity

没错,SecondeActivity以上的 ThirdActivity、ForthActivity都被销毁了。

也就是说,重用了栈里面已有的 SecondeActivity ,并且把它上面的 activity 都清除了,从而使得它暴露在最上面。

顺便说一下,最后一个SecondeActivity的启动没有调用onCreate,而是依次调用了onRestart、onStart、onNewIntent、onResume这些生命周期方法。

4.4. 小结

被标记为singleTask的Activity,在启动的时候如果当前没有实例,就和standard模式一样,直接压栈到当前activity上;如果已经有实例了,就把该目标Activity实例上面的activity都清除,从而将目标Activity暴露到最上面,调用了其onNewIntent方法

5. taskAffinity属性

上面的两个例子都在我们认知范围内,还比较熟悉。但是这个taskAffinity想必就不太熟悉了。

taskAffinity是标记当前activity附属到哪个task上的。

5.1. 配置方式

  • manifest文件里
    在activty节点里配置该属性即可。taskAffinity取值是一个字符串,用来唯一标识一个Task的。

默认情况下,也就是不配置,taskAffinity取的是应用的包名。

 <activity android:name="com.example.test.SecondActivity"
             android:launchMode="singleTask"
             android:taskAffinity="com.example.test.second">
        </activity>

5.2. 意义(作用)

配合singleTask使用,意味着被这两个属性标记的activity可以被指定到一个新的task里。

5.3. 举例

假设下面的跳转关系:

MainActivity -> SecondeActivity -> ThirdActivity

其中,SecondeActivity被设置了singleTask的启动模式,并且配置了taskAffinity属性,MainActivity和ThirdActivity都不做任何操作,保持默认,即standard模式

那么跳到ThirdActivity后,当前的Activity栈情况从顶到底部是:

Task1: ThirdActivity、MainActivity

Task2: SecondeActivity

可以看到,SecondeActivity被创建到了新的栈里。

于是,可以得出之前疑问的答案,什么条件下设置为singleTask的activity会被创建到新的task呢?

答案是,同时被指定了另一个taskAffinity属性值的时候。

5.4. 回退顺序

现在处于onResume的activity是ThirdActivity,如果这时候按返回键呢?activity的显示顺序会是什么样呢?

答案正如上面Task1、Task2栈的排列顺序,ThirdActivity弹出后,MainActivity显示;再按返回键,MainActivity弹出后,SecondeActivity显示。

可以看出,新建的Task处于下方。

5.5. 总结

  1. 把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至于是否在一个新任务中启动,还要受其他条件的限制,这个条件就是taskAffinity属性配置为不同于包名的其他字符串。如果没有配置,默认就是当前包名,在当前Task内操作。
  2. 在启动一个singleTask的Activity实例时,如果系统中已经存在这样一个实例,就会将这个实例调度到任务栈的栈顶,并清除它当前所在任务中位于它上面的所有的activity。
    如果不存在,就看taskAffinity属性对应的Task是否存在,如果存在,就把Activity压入该Task内栈里;否则,就新建一个Task,再把Activity压入该Task内栈里。
  3. singeTask模式保证了在一个Task内只有一个activity实例

参考文章:https://blog.csdn.net/zhangjg_blog/article/details/10923643

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 嵌入式语音识别智能家居笔记1

    嵌入式语音识别智能家居笔记11.环境VMware15.5Ubuntu18.04Qt安装包2.共享目录设置VMware->虚拟机->设置->选项->共享文件夹3.QT的linux安装包:qt-opensource-linux-x64-5.9.1.run复制到共享目录打开终端:cd/mnt/hgfs/sharesudo./qt-opensource-linux-x64-5.9.1.run4.直接搭服务器失败(1)sudodate-s2016-…

    2022年6月26日
    23
  • 《手把手教你学DSP-基于TMS320F28335》书中的错误

    《手把手教你学DSP-基于TMS320F28335》书中的错误1.在书的345页,这种字符串写法是错误的,char*msg。2.估计张卿杰可能是个学着。书的风格感觉就是翻译的PDF文档。转载于:https://www.cnblogs.com/429512065qhq/p/9686253.html…

    2022年5月22日
    32
  • idea设置背景黑色_idea主题样式设置

    idea设置背景黑色_idea主题样式设置1、File=>Settings2、Appearance=>Darcula

    2022年4月19日
    63
  • 达梦数据库安装及配置图文教程 附DM8安装包

    达梦数据库安装及配置图文教程 附DM8安装包达梦数据库的安装欢迎使用新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用你好!这是你第一次使用M…

    2022年5月28日
    64
  • 主宰操作系统的经典算法

    主宰操作系统的经典算法此篇文章带你梳理一下操作系统中都出现过哪些算法进程和线程管理中的算法进程和线程在调度时候出现过很多算法,这些算法的设计背景是当一个计算机是多道程序设计系统时,会频繁的有很多进程或者线程来同时竞争CPU时间片。那么如何选择合适的进程/线程运行是一项艺术。当两个或两个以上的进程/线程处于就绪状态时,就会发生这种情况。如果只有一个CPU可用,那么必须选择接下来哪个进程/线程可以运行。操作系统中有一个叫做调度程序(scheduler)的角色存在,它就是做这件事儿的,调度程序使用的算法叫做调度算

    2022年6月4日
    31
  • C++滑动窗口算法_最短连续包含子串

    C++滑动窗口算法_最短连续包含子串滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。如下题给你两个长度相同的字符串,s和t。将s中的第i个字符变到t中的第i个字符需要|s[i]-t[i]|的开销(开销可能为0),也就是两个字符的ASCII码值的差的绝对值。用于变更字符串的最大预算是maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将s的子字符串转

    2025年7月10日
    5

发表回复

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

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