Activity启动模式singleTask的理解
- 1. Activity启动模式singleTask的理解
- 2. Task与Activity栈
- 3. singleTask设置方式
- 4. singleTask的意义(作用)
- 4.1. 举例说明
- 4.2. 例子1
- 4.3. 例子2
- 4.4. 小结
- 5. taskAffinity属性
- 5.1. 配置方式
- 5.2. 意义(作用)
- 5.3. 举例
- 5.4. 回退顺序
- 5.5. 总结
1. Activity启动模式singleTask的理解
2. Task与Activity栈
Task是一些Activity的集合,以Activity栈的形式存放。因此,Task是概念上的,Activity栈是实体上的。
可以说,新启动了一个Task就是新建了一个Activity栈,来存放这个Task内的Activity。
3. singleTask设置方式
- manifest文件
在activity节点里添加属性:
<activityandroid: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. 总结
- 把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至于是否在一个新任务中启动,还要受其他条件的限制,这个条件就是taskAffinity属性配置为不同于包名的其他字符串。如果没有配置,默认就是当前包名,在当前Task内操作。
- 在启动一个singleTask的Activity实例时,如果系统中已经存在这样一个实例,就会将这个实例调度到任务栈的栈顶,并清除它当前所在任务中位于它上面的所有的activity。
如果不存在,就看taskAffinity属性对应的Task是否存在,如果存在,就把Activity压入该Task内栈里;否则,就新建一个Task,再把Activity压入该Task内栈里。 - singeTask模式保证了在一个Task内只有一个activity实例
参考文章:https://blog.csdn.net/zhangjg_blog/article/details/10923643
Activity启动模式singleTask的理解相关推荐
- activity 启动模式_Android世界:Activity的启动模式及其适用范围
一.Activity启动模式简介 activity启动模式,可以理解为activity在任务栈(也叫"回退栈")的回退规则,即点击"back"键时,activi ...
- Android利用activity启动模式退出整个应用
Android利用activity启动模式退出整个应用 作者:翔星幻羽发布于:02月22日 13:39访问(22)评论(0) Android利用activity启动模式退出整个应用 分类: andro ...
- 深入理解Activity启动模式之launchMode
Android每个Application都是由若干个四大组件组成的.每个页面都是一个Activity,当需要打开相应页面(Activity)时系统会创建他们的实例并把他们一一放入栈中进行管理.任务栈是 ...
- 深入理解Activity启动模式之大结局
谈起Activity的启动模式必不可少的要是launchMode.Flags.taskAffinity这三块知识点,上一篇文章 深入理解Activity启动模式之launchMode 看过的同学都知道 ...
- activity 启动模式_腾讯大牛:你根本不懂Activity!
码个蛋(codeegg)第 583 次推文 作者:厘米姑娘 原文:https://www.jianshu.com/p/602b1ec4ca7a 在之前的Activity篇主要学习Activity的生命 ...
- Android初级开发笔记-- activity启动模式的学习(1)
第一次学习Android中一个很重要的概念,启动模式.文章记录的也只是一些入门知识,随着学习的深入还会有activity启动模式的学习(2)和(3). 下面分三个小点说一下对启动模式的理解区别以及如何 ...
- Android activity启动模式
如何正确理解和使用 Activity的4种启动模式 关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法 ...
- Android中Activity启动模式
Android中Activity启动模式一共是四种,这里我写一下我对其的理解: 1.standard(默认) 2.singleTop,如果某个Activity设置了该属性,且当前Activity就是这 ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- (二)Activity启动模式
启动模式 一.概念 顾名思义,就是activity的启动方式方法,共有4种模式standard,singleTop,singleTask,singleInstance. 为什么要学习启动模式呢?因为有 ...
最新文章
- 【TensorFlow2.0】(3) 索引与切片操作
- SAP WM Storage Type Search配置里的Storage Class WPC标记
- Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方案
- kong plugin rate limiting
- 刷breed 极路由3_路由器接入usb打印机制作无线打印机服务器
- python中none是什么类型_如何在Python中”测试”None类型?
- 三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...
- Vmware 中Linux中NAT网络异常解决方法
- (20120731)Android中的各种对话框总结(dialog)
- 在统计模式识分类问题中,当先验概率未知时,可以使用
- c语言max函数和min,使用函数获取值,查找max,查找min并以C语言显示
- 网页游戏常见外挂原理及防御
- Jeffery C. Hill
- java开发手机app_java 怎么开发手机app接口?
- 如何衡量一个算法的好坏
- 【附证明】用ArcGIS中Band Collection Statistics做相关性分析可能存在错误
- 黑马程序员 jQuery
- 泽塔云在2022年Gartner中国区超融合市场竞争报告中被评为优秀厂商代表
- 河北大学生命科学学院期末Biopython编程实践。利用Biopython包读取新冠病毒(id:NC_045512.2)序列(GenBank格式NC_045512.2.gb),将其中FEATURE的类
- java反射获取所有接口实现类