一、任务、回退栈的概念

一个任务是多个能够和用户进行交互并且能完成某种功能的activities的集合。 这些Activity被安排回退栈中,能在合适的时候被打开显示出来。

在我们使用Android手机的时候,当通过点击一个图标来启动一个应用的时候,此时任务就来到了前台,如果此时还没有创建过这个任务的话,一个新任务就会被创建(也就是最近没有使用过这个应用的时候),并且第一个启动的Activity 被放置在该任务的回退栈中。

二、回退栈的栗子

当一个Activity启动了一个新的Activity的时候,新的Activity被加入到栈顶。之前的Activity仍然在栈中,但是已经停止了(执行onStop)。这个时候系统仍然保存这他的用户界面的状态,如果此时用户单击了Back键返回,当前的Activity(新打开的)由于在栈顶,所以被从栈中推出去了(也就是Activity会执行生命周期的 onDestroy方法去销毁)。在一个回退栈中的Activity不会重新排列,它的方式是“后进,先出“的。看官网給的一幅图帮助我们理解:

如果我们一直单击回退键,此时栈中会一次按照后进先出的方式将Activity一一出栈,当栈中不存在Activity时,就回到了我们的Home 界面了。

三、任务的栗子

任务我们可以理解为它包含着回退栈(back stack),它是能在后台运行的。when users begin a new task or go to the Home screen, via the Home button. While in the background, all the activities in the task are stopped, but the back stack for the task remains intact—the task has simply lost focus while another task takes place, as shown in figure 2.当用户启动一个新任务(例如在当前应用调用了其他应用)或者点击home键的时候,我们此时的任务就在后台运行了,该任务对应的栈中的所有Activity都被停止(执行了了onStop方法),但是注意此时该任务中的回退栈依然存在,它仅仅是失去了焦点。具体情况看下图:

上面的情况在大家用手机的时候就可以打开两个不同应用然后点击home键切换去感受,就不举个栗子了。值得注意的是,如果当我们系统的内存不足的时候,系统可能会干掉我们的某个任务。

上面我们也说过了,由于回退栈具有“后进先出“的特点,它里面的Activity是不可以重新进行排列的。那我们大家想象一种情况:如果我们新建了一个ActivityA,然后放置一个Button,每次点击Button又启动ActivityA,这样我们连续点击多次。回退栈里面就会一直添加ActivityA的多个实例,当我们点击回退键的时候,每次都是一个ActivityA。这很明显不是我们要的效果,难道我们不可以每次启动的时候把ActivityA就用之前加入的那个ActivityA吗。android系统当然考虑了这种情况,这就是管理任务的方式–启动模式

四、启动模式

我们可以通过启动模式来修改修改系统的默认行为

启动模式主要有四种,他们分别是:standard,singleTop,singleTask,singleInstance。

  1. standard(标准模式)

    这是系统的默认模式,也就是每次启动activity都会创建一个新的实例。需要注意的是,每个实例可以属于不同的任务栈,每个任务栈也可以对应多个实例。谁启动了该模式的activity,一个该activity的实例就会被放置到谁的任务栈中。

  2. singleTop(栈顶复用模式)

    根据它的名字我们就可以想到,如果一个activity已经存在于一个任务栈中,那么系统就不会创建一个该activity的新实例,而是使用栈顶的activity实例,并且调用该activity的onNewIntent()的方法。在这种情况下,一个activity也能被实例化多次,每个实例能属于不同的任务,每个任务也能有多个实例(只有在activity在栈顶的时候,不会重新创建)

  3. singleTask(栈内复用模式)

    如果一个activity存在于任务栈中,那么系统会使用该实例并且调用它的onNewIntent() 方法,这种模式下在一个任务中只能有一个实例。

  4. singleInstance(单实例模式)

    这个模式除了拥有singleTask的所有特点外,在该模式下的activity实只能单独的在一个任务栈中。

深入理解Activity-任务,回退栈,启动模式的更多相关文章

  1. 如何正确理解和使用 Activity的4种启动模式

    关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法,便于读者正确应用. Activity的启动模式有4 ...

  2. Android Activity的4种启动模式详解(示例)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...

  3. Android中Activity的四种启动模式

    要了解Android的启动模式先要了解一下Activity的管理方式: 1.Activity的管理机制 Android的管理主要是通过Activity栈来进行的.当一个Activity启动时,系统根据 ...

  4. 安卓基础之Activity的四种启动模式

    Activity的四种启动模式   Activity的启动模式在清单文件中配置: <activity ... activity:lauchMode:"..."; //有四种模 ...

  5. Activity生命周期以及启动模式对生命周期的影响

    前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期 ...

  6. Android零基础入门第77节:Activity任务栈和启动模式

    通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...

  7. Activity的四种启动模式

    Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. ...

  8. Activity的四个启动模式

    /** * Activity有四种启动模式(android:launchMode) * 分别是: * 1. standard(默认),可以不停的在栈中创建新的Activity * 2. singleT ...

  9. Activity的四种启动模式-图文并茂

    1.对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例.   例如A启动A,A再接着启动A,A继续启动A,然后再分别出栈,如图所示 ...

  10. Activity的四种启动模式和onNewIntent()

    转自:http://blog.csdn.net/linghu_java/article/details/17266603 Android中Activity启动模式详解   在Android中每个界面都 ...

随机推荐

  1. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  2. Log4Net 手册

    首先感慨下,现在的程序员做的工作因为高级语言的生产力,系统框架模式的成熟,开源大牛的贡献,已经成越来越偏向 “面向配置编程”了...... 详细使用指南见文章:http://blog.csdn.net ...

  3. 免费下载:320+ 手绘风格 Apple iOS7 图标

    Themify 图标是一套用在网页设计和应用程序的图标,包括 320+ 手工制作的像素完美的苹果  iOS7 图标中汲取灵感.这些图标完全免费,您可以用于任何目的,无论是个人或商业. 您可能感兴趣的相 ...

  4. Pop - Facebook 开源 iOS & OS X 动画库

    Pop 是一个可扩展的 iOS & OS X 动画引擎.除了基本的静态动画,它支持弹簧和动态衰减的动画,因此可以用于构建现实的,基于物理的交互效果. 它的 API 可以与现有的 Objecti ...

  5. 2014.7.12 敏捷个人奥森健步走&敏友分享会.活动报道

    今天是个阳光明媚的日子,正式开起了敏捷个人2014年每月一次的健步走&读书分享活动. 周老师一大早8点就到了森林公园南门,一边看书一边等候敏友们的到来.时间走到了9点半,大家基本到齐了,我们准 ...

  6. 转载:全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新!

    微信应用号(小程序,「应用号」的新称呼)终于来了! 目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子?怎样将一个「服务号」改造成为「小程序」? 我们暂时以 ...

  7. iOS实现图像的反色,怀旧,色彩直方图效果

    反色是与原色叠加可以变为白色的颜色,即用白色(RGB:1.0,1.0,1.0)减去原色的颜色.比如说红色(RGB:1.0,0,0)的反色是青色(0,1.0,1.0).在OPENGL ES中为1. 通过 ...

  8. 快速暴力解决Eclipse ADT和Android Studio兼容问题,创建同时兼容ADT和AS的安卓工程

    环境:AS 2.1.2+Java1.7+Gradle 2.14+ADT 24.0.2+MyEclipse 2015 前言:因为比赛要求使用ADT,而我本身比较习惯使用AS开发,遂想办法打造兼容两个ID ...

  9. Weex中文文档

    这里整理当前已译出的Weex中文文档,如需查阅完整Weex文档,请访问http://alibaba.github.io/weex/doc/ . 同时也欢迎大家参与Weex中文文档翻译 [Guide] ...

  10. 几种web字体格式

    目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字体逐渐成为话题,这项让未来Web更加丰富多彩的技术拥有多种实现方案,其中之一是通过@font-face属性在网页中嵌入自定义字体 ...