一、任务、回退栈的概念

一个任务是多个能够和用户进行交互并且能完成某种功能的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. 进阶学习js中的执行上下文

    在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; functio ...

  2. [IR] Probabilistic Model

    If user has told us some relevant and some irrelevant documents, then we can proceed to build a prob ...

  3. Hadoop入门进阶课程8--Hive介绍和安装部署

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  4. SQL Server 存储(2/8):理解数据记录结构

    在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...

  5. JS魔法堂:通过marquee标签实现信息滚动效果

    一.前言   有限的空间展现无限的内容,这是滚动最常用到的地方.根据信息滚动效果我们可以有很多的实现方式,但HTML自带的 marquee标签 是其中一个较简单的实现方式.下面记录一下,供日后查阅. ...

  6. 【转】http-equiv="X-UA-Compatible" 设置IE浏览器兼容模式详解

    文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE ...

  7. DataBase --- Intellij IDEA 14.1.4使用Java连接SQL Server教程

    Java连接数据库的方法大体分为两种:正向连接和反向连接.反向连接需要编译器提供相关的插件来支持,目前主流的java IDE都支持反向连接.这里主要对正向连接做一个经验总结. 一.数据库的配置 1.新 ...

  8. (一)JAVA项目(非web项目)部署到windows服务器运行

    [转]http://blog.csdn.net/tracy19880727/article/details/11205063 一般服务器运行的几乎都是web项目,今天遇到一个问题,把写好的Java项目 ...

  9. JS代码放置位置、变量与数据类型、运算符与逻辑表达运算符

    内容简要: 1.JS代码放置位置的问题: 2.变量与数据类型: 3.运算符与逻辑表达式的运算符   我的位置 全局问题:为何在网页推荐位置(一般在<head></head>内部 ...

  10. ExtJS4图片验证码的实现

    ExtJS4学习笔记(十)---ExtJS4图片验证码的实现 转自:http://blog.sina.com.cn/s/blog_8d4bbd890100xaxh.html     上多少篇文章,重要 ...