一、引言

我们在多次启动同一个Activity时,系统默认会重复创建多个实例,这样看上去便十分的愚蠢,所以android在设计时提供了启动模式来修改系统的默认行为。目前有四种启动模式:standard、singleTop、singleTask和singleInstance。

二、如何设置启动模式

1.我们可以通过AndroidMenifest为Activity指定启动模式

    <activity android:name=".SecondActivity"
android:configChanges="screenLayout"
android:launchMode="singleTask"
>
</activity>

2.我们可以通过Intent标志位来为Activity指定启动模式    Intent intent = new Intent(); 
           intent.setClass(MainActivity.this,SecondActivity.class);
           intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//android标志位
           startActivity(intent);
三、启动模式介绍

在学习时看到一篇不错的博客,图画的很清晰明白,在这里就不重复了。附上链接              http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html

1.stardand(系统默认):

在这里我们先将任务栈,直接看成一个栈,来简单了解,不做具体分析。

当我们使用stardand时,每启动一次activity,他就会在启动他的activity所在的栈中创建实例。

当我们用ApplicationContext去启动他时系统会报错。这句话我看书的时候不是特别明白,什么是非activity的context,所以 去查了下资料,service、application和activity都是context的子类,看到这里就明白了,context不只是单指activity。所以接下来的话便好理解了,因为非activity的context没有任务栈,所以一但有他们去启动一个stardand模式的activity,便会因为没有任务栈,使得程序报错。

解决方法,我们可以想到既然他缺少一个存放他的任务栈,那么我们便为他创建一个。指定FLAG_ACTIVITY_NEW_TASK标记位。但如此处理他的启动方式便成为了singleTask.

2.singleTop(栈顶复用):

当我们所要启动的activity已经位于栈顶的时候,那么activity不会被重建,同时他的onNewIntent方法会被回调,这里又有疑问了,什么是onNewIntent方法。查资料后发现,在singleTop模式中,系统并不会调用我们通常处理数据的onCreat()方法,而是调用另一个方法onNewIntent(),所以说我们为什么要调用onNewIntent()而不时onCreat()方法呢?找了好多博客,发现这个

链接:http://blog.sina.com.cn/s/blog_74cb7ee101017njt.html 我看了半天,应该是调用onCreat()方法时便会创建一个activity的实例吧(可能我的理解有问题,若是您发现的话请指出,谢谢)。

附一个书上的例子

D(singleTop)    ABCD---启动D--->ABCD

D(stardand)     ABCD---启动D--->ABCDD

3.singleTask(栈内复用模式):

单实例模式,只要activity在一个栈中存在,那么多次启动他均不会创建实例,回调onNewIntent方法。

举例:当启动A时,系统会先找是否存在A所需要的栈(这里的所需要涉及到了一个参数:TaskAffinity,这个参数指定了activity所需要的任务栈,默认为应用的包名),若不存在则新建一个栈,创建A的实例,并放入栈中。若存在,则看其中是否存在A的实例,不存在则创建并压入栈中,若存在,则调到栈顶,回调onNewIntent()方法。

D(singleTask) 需要S2

1.S1 ABC--> S1 ABC --->S1 ABC

S2              S2 D

2. S1 ABC--->S1 ABCD

3. S1 ADBC-->S1  ADB--->S1  AD

4.singleInstance(单实例模式)

加强型singleTask模式,具有此种模式的activity启动时,系统会单独建立一个任务栈来存放他。如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例

D(singleInstance)

1.S1 ABC--启动D->S1 ABC

S2 D

除非S2被销毁,那么启动D时,一直不需要重新创建。

到目前为止,启动模式已经全部介绍完了,以上是我的全部学习体会,如果有什么不对的,或是写的不好的地方,请指正,谢谢。PS.(第一次写博,有点虚)

Android进阶--Acticivity的启动模式的更多相关文章

  1. Android开发之---Activity启动模式

    在Android开发中,启动一个新的activity我们可以使用startActivity或startActivityForResult,Android系统使用栈的方式来管理一个APP的页面显示与保存 ...

  2. Android中Activity的启动模式

    简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...

  3. android launchmode(四种启动模式)应用场景及实例

    模式介绍 [1] standard 模式 这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中. [2] singleTop 模式 如果在任务的栈顶正好存在该Activ ...

  4. Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

    SingleTask启动模式探究 GitHub如题:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity,再从C中又启动AActiv ...

  5. Android:活动的启动模式

    启动模式一共有四种,分别是 standard .singleTop . singleTask 和 singleInstance , 可 以 在 AndroidManifest.xml 中 通 过 给 ...

  6. android:Activity四种启动模式简单介绍

    Activity启动模式 能够依据实际的需求为Activity设置相应的启动模式,从而能够避免创建大量反复的Activity等问题 Activity有四种载入模式 1.standard(默认启动模式, ...

  7. android:process结合activity启动模式的一次实践

    会有这样的场景,一个应用崩溃了,而导致的该应用崩溃的原因是,该应用占用的内存大小超过了系统分配给它的最大堆大小.对象的分配,是发生在堆(heap)上面的,系统分配给每个应用的最大堆大小是固定的. 假设 ...

  8. 【Android学习入门】Android中activity的启动模式

    启动模式简单地说就是Activity启动时的策略,在Androidmanifest.xml文件中的标签android:launchMode属性设置,在Android中Activity共有四种启动模式分 ...

  9. Android之Activity的启动模式

    启动模式有4种,分别为:1.standard(默认)  -- 标准2.singleTop  -- 单顶3.singleTask -- 单任务4.singleInstance: -- 单例  -- 如果 ...

随机推荐

  1. 我的MYSQL学习心得(十七) 复制

    我的MYSQL学习心得(十七) 复制 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  2. 冗余代码都走开——前端模块打包利器 Rollup.js 入门

    之前翻译过一篇文章,介绍了通过 ES2015 的解构赋值语法引入模块,可以让打包工具(browserify)最终编译出来的代码量最小化. 殊不知在 webpack 1.X 版本是无法利用该特性来避免引 ...

  3. JavaScript的妙与乐(一)之 函数优化

    JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...

  4. Binder In Native

    关于Binder的设计思想与Driver层实现细节可以看这个:Android Binder设计与实现 - 设计篇,这里首先简要概括一下. Service的每个Binder实体位于Service所属的进 ...

  5. ABP源码分析二十七:ABP.Entity Framework

    IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...

  6. 命令行查看Windows激活信息(win7、win8、win10...)

    使用:Win+ R 组合键,打开运行命令框,复制命令,粘贴后回车. slmgr.vbs -xpr 查询Windows是否永久激活slmgr.vbs -dlv 查询到Windows的激活信息,包括:激活 ...

  7. 常用数据库的驱动程序和Url地址

    常用数据库的驱动程序及JDBC URL: Oracle数据库: 驱动程序包名:ojdbc6.jar 驱动类的名字:oracle.jdbc.driver.OracleDriver JDBC URL:jd ...

  8. Atitit webservice发现机制 WS-Discovery标准的规范attilax总结

    Atitit webservice发现机制 WS-Discovery标准的规范attilax总结 1.1. WS-Discovery标准1 1.2. 一.WS-Discovery1 1.2.1.   ...

  9. vue中,class、内联style绑定、computed属性

    1.绑定Class ①对象语法 <li :class="{ 'active': activeIdx==0 }" @click="fnClickTab(0)" ...

  10. Application Request Route实现IIS Server Farms集群负载详解

    序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...