Activity之启动模式
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Activity具有四种启动模式:standard、singleTop、singleTask、singInstance。启动模式可通过AndroidManifest.xm中Activity的launchMode属性配置,或者通过使用Intent flags设置。
standard模式
默认启动方式,当执行startActivity时,默认会创建一个新的Activity实例并加入到任务栈中。
singleTop模式
当执行startActivity时,如果当前任务栈中已经具有该Activity实例,并且位于栈顶,则不会创建新实例,而会调用原有实例的onNewIntent方法。否则,创建新的实例并加入栈顶。
比如:假如任务的后退栈中包含四个ActivityA-B-C-D(D位于栈顶)。当新的Intent希望启动D,而D得launchMode是默认的“standard”,则将会产生一个新的D加入到栈顶,则后退栈变成A-B-C-D-D。 如果D的launchMode是"singleTop",则原有的D实例将会通过onNewIntent来接受intent。则任务栈依然是A-B-C-D。 如果要求启动B,则将会新建一个D加入到栈中,即使B的launchMode是"singleTop"。
singleTask模式
如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的onNewIntent()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。
在这个位置,我有一个疑问,新创建的Activity实例是加入到原有任务栈中还是创建一个新的任务栈呢? 之所以会有这个疑问,是因为Google的官方文档上的描述是这样的:
文字信息是:
The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to itsonNewIntent()
method, rather than creating a new instance. Only one instance of the activity can exist at a time.
大意是,对于设置为"singleTask"的Activity,如果在task中不存在该Activity实例,系统将创建一个新的task和新的Activity实例,然后将这个Activity实例放在新的task的根(也就是栈底)。如果已经存在该实例,则通过调用onNewIntent将intent传递给该实例。
我们的关注点放在是否创建新的task上,在我看来一个task就对应一个后退栈,那么是否意味着利用singleTask新创建的Activity实例会放到新的栈上呢?
在博客园或者CSDN上看到很多博主关于singleTask的模式的介绍都没有明确这一点,因此很是疑问。不过,在网上看到一篇文章《深刻理解Activity启动模式XXX》,应该能解答我的疑惑。里面有说到:
一个Activity的Launch Mode为singleTask时,在新建这个Activity时,默认taskAffinity情况下,一般不会新建task,taskAffinity属性默认application中是相同的,那么就会新建在当前栈。…… 其实,把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至于是否在一个新任务中启动,还要受其他条件的限制。增加一个taskAffinity属性给启动的singleTask的aty,那么将在新task启动。
对于这个问题暂时先搁置,之后想办法做实验进行验证。
singleInstance模式
整个系统中有且只有一个该Activity实例,且该实例位于单独的一个栈中,该栈中有且只有一个该Activity。当再次启动该Activity时,调用onNewIntent传递intent。
一个Activity的Launch Mode为singleInstance时,总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。
Activity之启动模式的更多相关文章
- 关于activity的启动模式
在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activi ...
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- android Activity的启动模式与flag的见解
最近做一个安卓项目,想要实现的效果就是:当打开一个按钮的时候,启动了一个A功能,当用户返回到桌面再继续进去的时候,不过之前在哪个Activity,都会先跳转到A功能的那个界面,当用户点击返回的时候,再 ...
- android Activity的启动模式
Android中Activity启动模式详解 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启 ...
- Activity的启动模式(android:launchMode)
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- 4种activity的启动模式
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- Activity的启动模式及回退栈的概念
Activity的启动模式 standard 正常模式 在创建一个新的activity的时候,直接在栈顶创建一个新的activity singleTop 顶部单个 在创建一个新的activity的时候 ...
- Activity 的启动模式
好久没用过那几种activity的启动模式了,如今看到singletop竟然傻了眼,完全忘记了这几种启动模式的区别!隧将两年前的总结翻出来,通读一遍那晦涩难懂的记录,又理解了一遍,在以前记录的基础上, ...
- Activity LauchMode启动模式(转载)
转载于:http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html 在一个Android应用中,不可避免的会包含多个Activ ...
- Android开发艺术2之Activity的启动模式
Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...
随机推荐
- c++ 操作符优先级
优先级 操作符 描述 例子 结合性 1 ()[]->.::++-- 调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作 ...
- 8、python中的集合
集合是python中无序.可变的数据结构.集合与字典类似,集合中的元素必须是可哈希的(等同于字典中的键),也就是说集合中的元素是唯一.不可变的数据类型.这里前面说集合可变,后面又说集合中的元素不可变是 ...
- 1、python的基础
一.python组成 python程序的内容主要由变量.数据.关键字.操作符组成. 二.变量 在python中,变量指的是其指向的数据是可变的. 首先我们要了解一下python的内存管理.数据创建后就 ...
- 51NOD 1292 1277(KMP算法,字符串中的有限状态自动机)
在前两天的CCPC网络赛中...被一发KMP题卡了住了...遂决定,哪里跌倒就在哪里爬起来...把个KMP恶补一发,连带着把AC自动机什么的也整上. 首先,介绍设定:KMP算法计划解决的基本问题是,两 ...
- IntentService和Service执行子线程对比
1.为何要用子程序 服务是在主线程中执行的,直接在服务中执行耗时操作明显不可取,于是安卓官方增加了IntentService类来方便使用 在Service中执行子程序代码如下 @Override pu ...
- JMX浅谈
一 JMX 是什么? JMX(Java Management Extensions,即Java管理扩展) JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构.设计模式.应用程序接口以 ...
- Linux程序编辑器
重点回顾:Linux底下的配置文件多为文本文件,故使用vim即可进行设定编辑: vim可视为程序编辑器,可用以编辑shell script,配置文件等,避免打错字 vi为所有unix like的操作系 ...
- synchronized 基本用法
常见三种使用方式 1)普通同步方法,锁是当前实例:2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁:3)对于同步代码块,锁是synchronized括号里配 ...
- Struts1 部分源码学习
Struts1工作原理 1.系统初始化(读取配置):初始化ModuleConfig对象 Struts框架是一个总控制器(ActionServlet)是一个Servlet,在web.x ...
- PostgreSql基础命令及问题总结
本章内容: 1.基本命令 基本命令 1.psql -U cdnetworks_beian -d cdnetworks_beian #-U指定用户,-d指定数据库 2.\l ...