single task messageTop和single task messageTask有什么区别

Android Activity的四种启动模式(回退栈) - hellominefriend的个人空间 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
Android Activity的四种启动模式(回退栈)
& 11:27:11
/ 个人分类:
转载自:/plokmju/p/android_ActivityLauncherMode.html前言  在一个应用中,不可避免的会包含多个Activity,当开启多个Activity之后,当按后退键时,一般会回退到上一个Activity,这一点和浏览器有点类似,但是需要注意的是Android系统只能回退到上一个Activity,没办法前进到下一个Activity,维护这个功能就需要了解到一个回退栈(Back Stack)的概念。  这篇博客就着重讲&什么是回退栈?  首先先来了解一下应用程序与进程的关系,众所周知,Android下有四大组件:Activity、Service、Receiver、ContentProvider。一般开发一个应用程序,会包含多个Android组件,所以应用程序是一组组件的集合,而进程则是运行这些组件的载体。  而回退栈(Back Stack)只是针对Activity而言的,它是用来维护用的界面体验的,使一个Task让用户感觉就是一个应用,而无论其中的Activity是否来自同一个应用程序,所以不要把回退栈和进程弄混了。设备的Home页面是大多数Task的起始位置,当用户点击一个应用程序图标的时候,应用的Task就会来到前台,并把应用的主Activity压入BackStack的栈顶,并获得焦点,这个Activity称为根Activity,而在BackStack中的Activity可以通过点击回退键弹出栈并销毁,这时就会使上一个Activity获得焦点,直到用户返回到Home页,而当BackStack中的Activity都被弹出销毁之后,这个Task就不复存在了,但是这个程序的进程还存在(不在此时销毁)。&Task的状态  就像上面介绍的,每个Task都存在一个BackStack,而系统中可以存在多个Task,但是每次只有一个Task获得前台焦点,一般而言,系统允许用户在多个Task中切换,而被至于后台的Task中的Activity,将被置于Stopped状态。实际上,同一个Task中的Activity,只要不存在于栈顶并且获得前台焦点的Activity,那么它就是一个Stopped的状态。下图为官方文档中关于Task前后台的示例图:&&Activity的启动模式  根据Activity的不同的启动模式,它在BackStack中的状态是不一样的。Activity可以通过AndroidManifest.xml清单文件配置,在&Activity /&节点中的android:launchMode属性设置。它有四个选项:&standard  标准启动模式,也是默认启动模式,如果不设置android:launchMode属性的话。standard模式下的Activity会依照启动的顺序压入BackStack中。  下图是standard模式下,Activity的压栈和回退操作示意图:&&singleTop&  单顶模式,这种Activity启动模式,启动一个Activity的时候如果发现BackStack的栈顶已经存在这个Activity了,就不会去重新创建新的Activity,而是复用这个栈顶已经存在的Activity,避免同一个Activity被重复开启。  下图是singleTop模式下,Activity的压栈和回退操作示意图:  singleTop的应用场景很多,一般适用于可以复用而又有多个开启渠道的Activity,避免当一个Activity已经开启并获得焦点后,再次重复开启。比如说Android系统浏览器的书签页面,就是一个singleTop模式的Activity。Android的浏览器是基于WebKit内核编写的,它是支持JavaScript脚本语言的,可以通过JavaScript脚本设置浏览器书签,这样如果存在多个页面存在保存书签的JavaScript脚本,就会导致书签页面被多次开启,所以书签页面被设置为singleTop模式,这样可以避免在保存多个书签的时候重复开启书签页面。&singleTask  开启一个Activity的时候,检查BackStack里面是否有这个Activity的实例存在,如果存在的话,情况BackStack里这个Activity上所有的其他Activity。  下图是singleTask模式下,Activity的压栈和回退操作示意图:  singleTask的的适用场景为一般程序的主页面,当回退到主页面的时候,清除BackStack中,它之上的所有Activity,这样避免程序导航逻辑的混乱。比如Android系统的浏览器的主页面,就是singleTask模式的,上面提到,android下浏览器是Webkit内核的,它是由C语言编写的,而每次打开新的网页如果重新开启一个Activity,是非常耗费系统资源的(需要解析HTML、Script脚本),所以被设置为singleTask模式,这样在浏览器应用里,无论打开多少个页面,使用的都是同一个Activity。所以以后如果存在很耗费系统资源的Activity,可以考虑使用singleTask开启模式。&singleInstance  被标记为singleInstance启动模式的Activity,在启动的时候,会开启一个新的BackStack,这个BackStack里只有一个Activity的实例存在,并且把这个BackStack获得焦点。这是一种很极端的模式,它会导致整个设备的里,只会存在一个这个Activity示例,无论是从何处被启动的。  下图是singleInstance模式下,Activity的压栈和回退操作示意图: &  singleInstance一般适用于需要在系统中只存在一个实例的场景,比如Android系统的来电页面,多次来电均使用的是一个Activity。&  当然,在Android中,除了在AndroidManifest.xml清单文件中配置LauncherMode属性外,还可以在代码中设置启动模式。在组件中,启动一个Activity,需要用到startActivity()方法,其中传递一个Intent,可以使用Intent.setFlags(int flags)来设置新启动的Activity的启动模式,而通过代码设置Activity的启动模式的方式,优先级要高于在AndroidManifest.xml清单文件中的配置。&  Intent.setFlag(int flags)方法传递的一个整形的数据,被Android系统设置为了常量:FLAG_ACTIVITY_NEW_TASK:这个标识会使新启动的Activity独立创建一个Task。FLAG_ACTIVITY_CLEAR_TOP:这个标识会使新启动的Activity检查是否存在于Task中,如果存在则清除其之上的Activity,使它获得焦点,并不重新实例化一个Activity,一般结合FLAG_ACTIVITY_NEW_TASK一起使用。FLAG_ACTIVITY_SINGLE_TOP:等同于在LauncherMode属性设置为singleTop。&总结  这篇博客主要讲的是理论上的内容,也没什么示例代码,无非就是几种启动模式的特点需要注意一下,理解了Activity的启动模式,可以很好的提升用户的UI体验,对应用程序的推广是非常有好处的,毕竟一个用户体验很差的应用,是很难得到用户的推广的。Android 深入探讨sigleTask和singletop的区别_百度知道
Android 深入探讨sigleTask和singletop的区别
提问者采纳
不会新开一个,如果后台队列里有此activity,那么会直接唤到前台来显示;singleTop,如果当前展示的是此activity,就只显示当前activitysingleTask
来自团队:
其他类似问题
为您推荐:
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Android笔记(24)
摘自百度知道:
singleTop 的Activity和standard的几乎一样,
把singleTop和standard归为一类启动模式,这种模式不会引起任务栈的变更
singleTop和standard唯一的区别就是,singleTop的Activity,当处于栈顶时,再Start一个该Activity,不会创建新的Activity而是复用它,例如:
A为standard,B为singleTop,/ABAB表示任务栈,start:A表示启动Activity,初始栈为/A
/ABA start:A
/ABAA start:B
/ABAAB start:B
这样就明白了吧。
而singleTask,和singleInstance可以归为另一类启动模式,这种模式必然引起任务栈变更
singleTask和singleInstance的区别就是,singleInstance所在的任务栈,只能有它这一个Acitivity。
设A为standard,B为singleTask,C为standard
/BCA start:B
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2336次
排名:千里之外
原创:21篇
(2)(2)(13)(13)(1)我对standard、singleTop、singleTask和singleInstance四种Activity启动模式的理解 - EX天亮以后 - 博客园
之前自学android的时候,单从视频和书本上对这四种启动模式仅仅有了初步的字面上的理解。最近实战了下,也对这四种启动模式有了比较清晰的概念。
首先说下什么是Activity,按照我的理解,我们在手机上看到的每一个页面都是一个Activity,包括系统的桌面,也是一个Activity。
要启动一个Activity有四种模式:standard(标准启动模式)、singleTop、singleTask、singleInstance。
注: Aty1_1和Aty2_1为两个不同的Activity,Aty1_1和Aty1_2为同一个Activity中的不同实例。
1. standard
& & 不同的Activity在同一个栈中,
& & 每次创建新实例的时候,新实例便会堆放到栈顶。
& & & 当点返回键的时候,便会从栈顶按顺序将实例移除栈。直至栈为空则退回到桌面。
2. singleTop
& &&不同的Activity在同一个栈中。& &
& & ① 如果此时Aty1的实例在栈顶,此时再创建一个新的Aty1并不会成功。
& & ② 如果Aty_1不在栈顶,此时再创建一个Aty1的实例,会产生一个新的Aty1实例到栈顶。
& & 当点返回键的时候,便会从栈顶按顺序将实例移除栈。直至栈为空则退回到桌面。
3. singleTask
& & 不同的Activity在同一个栈中。
& &&① 如果此时Aty1的实例在栈顶,此时再创建一个新的Aty1并不会成功。
& &&② 如果Aty_1不在栈顶,此时再创建一个Aty1的实例,页面会返回到任务栈中存在的Aty1的实例,并将Aty1上面所有的实例移出栈。
& &&当点返回键的时候,便会从栈顶按顺序将实例移除栈。直至栈为空则退回到桌面。
4. singleInstance
& & 不同的Activity 处于不同栈中
& &&① 如果此时Aty1的实例在栈顶,此时再创建一个新的Aty1并不会成功。
& & ②&如果此时Aty2的实例还未被创建,则创建的Aty2的实例时会存放到一个新的任务栈中。
& & ③&如果此时Aty1的实例已存在且我们在Aty2的页面中创建新的Aty1实例时,则不会创建新的Aty1实例,而是页面跳转到原来任务栈中存在的Aty1的实例,但存放Aty2实例的任务栈仍然存在
& &&当点返回键的时候,便会依次销毁相应的任务栈,直至任务栈数为空则退回到系统桌面。
以上是我对安卓四种Activity启动模式的理解,如果有不对的地方还望指正。3002人阅读
Android开发(45)
activity的四种加载模式
在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
在android里,有4种activity的启动模式,分别为:&standard,&singleTop,&singleTask和singleInstance,&其中standard和singleTop类似,&singleTask和singleInstance类似,&用法如下:
(1).standard和singleTop
这两种加载模式下,&同一个task中可以存在一个activity的多个实例,&并且可以位于activity栈的任意位置。
先举个例子:
假设目标task的activity栈为:&A-&B-&C-&D(栈底-&栈顶)
在程序中调用startActivity(D)&
如果D是standard模式,&则activity栈变为:
A-&B-&C-&D-&D,&也就是会重新创建一个D实例
如果D是singleTop模式,&则activity栈变为:
A-&B-&C-&D,&不会创建D实例,&就是说如果D在目标task&的activity栈的栈顶,&则不会创建新的实例,&而是调用D的onNewIntent()方法,&反之如果D不在目标task&的activity栈的栈顶,&则会重新创建一个D实例
(2).&singleTask和singleInstance
这两种加载模式下,&同一个task中只会存在一个activity的实例,&如果通过startActivity()启动,则调用onNewIntent()方法,&而不是创建一个新的实例。这两种模式下,&activity实例均位于activity栈的栈底。
这两种加载模式的区别:
假设一个Activity的实例A&采用如下两种加载模式:
singleTask:
&&&如果A调用startActivity(B)启动B实例,&则A和B位于同一个task中。
singleInstance:
&&&如果A调用startActivity(B)启动B实例,&则系统会自动给intent添加一个属性FLAG_ACTIVITY_NEW_TASK,&将B实例放入到一个新的task中,&也就是说A实例所在的task中只能有A自己,&不能存在其他实例
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:452135次
积分:6348
积分:6348
排名:第2455名
原创:193篇
转载:102篇
评论:78条
(1)(1)(3)(5)(8)(3)(7)(18)(2)(2)(1)(1)(4)(14)(64)(140)(3)(8)(7)(1)(2)

我要回帖

更多关于 singletop singletask 的文章

 

随机推荐