一、引言

我们在多次启动同一个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. 【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知

    目录 说明 实现方法 APP生命期 后台任务 说明 之前网上有人建议增加磁贴(tile).徽章(badge)功能.利用周末的时间,将这两个功能添加上去了.如果将磁贴固定到开始屏幕,磁贴就会循环播放首页 ...

  2. 高薪诚聘熟悉ABP框架的.NET高级开发工程师(2016年7月28日重发)

    招聘单位是ABP架构设计交流群(134710707)群主阳铭所在的公司-上海运图贸易有限公司 招聘岗位:.NET高级开发工程师工作地点:上海-普陀区 [公司情况]上海运图贸易有限公司,是由易迅网的创始 ...

  3. ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之9.ABP设置管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  4. .NET 基础一步步一幕幕[方法、结构、枚举]

    方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...

  5. xamarin MasterDetailPage点击Master时卡顿现象

    在很多项目中经常会使用到MasterDetailPage的布局方式,而且一般做为主页面来开发,在开发中,发现一个并不算Bug的问题,但是却发生了,以此记录下来,方便大家探讨. 现象是这样的,我开发了一 ...

  6. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  7. js文章列表的树形结构输出

    文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...

  8. ASP.NET MVC系列:Area

    1. Area简介 ASP.NET MVC Area机制构建项目,可以将相对独立的功能模块切割划分,降低项目的耦合度. 2. Area设置Routing 新建Admin Area后,自动创建Admin ...

  9. http程序接口、调用(最入门级,文末附Demo)

    HTTP协议简介 既然是基于HTTP协议开发,那么就首先要了解下HTTP协议的相关内容- 在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议的顶层.浏览Web时,浏览器通过HTTP ...

  10. 劈荆斩棘:Gitlab 部署 CI 持续集成

    阅读目录: install configue gitlab-ci-multi-runner restore nuget packages bulid .sln run unit tests confi ...