一、任务、回退栈的概念

一个任务是多个能够和用户进行交互并且能完成某种功能的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. 【转载】 IE/Firefox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法

    [参考了别人的文章]我们做技术,经常在写页面的时候需要多次刷新测试,可是浏览器都有自己的 缓存机制,一般CSS和图片都会被缓存在本地,这样我们修改的CSS就看不到效果 了,每次都去清空缓存,再刷新看效 ...

  2. 使用log4net

    原文:<使用log4net,没有日志文件生成> Posted on 2014/06/12 ================================================= ...

  3. 在 VS 中嵌套文件

    效果如下: 用到扩展工具:NestIn 可以通过 VS->工具->扩展管理器->联机库 搜索安装. In WPF: How to create resource dictionary ...

  4. 用于软件包管理的21个Linux YUM命令 转载

    http://flycars001.iteye.com/blog/1949085 YUM到底是啥东东? YUM(Yellowdog Updater Modified)是一款开源命令行及图形化软件包管理 ...

  5. 【转载】VMware下LINUX的虚拟机增加磁盘空间

    转载自:http://space.itpub.net/24435147/viewspace-694200 VMware6.7安装目录下有一个命令行工具vmware-vdiskmanager.exe 程 ...

  6. 【转载】Ubuntu下SVN安装和配置

    一.SVN安装 1.安装包 1.$ sudo apt-get install subversion 2.创建项目目录 $ sudo mkdir /home/xiaozhe/svn $ cd /home ...

  7. mysql depended_query 优化案例一则

    月度利息统计sql优化 原因:写的sql语句复杂,理解起来有难度,另一方面,查询性能比较低 原来的语句如下: SELECT tp.year, tp.month, tp.bid_id, b.`title ...

  8. 搜索 + 剪枝 --- POJ 1101 : Sticks

    Sticks Problem's Link:   http://poj.org/problem?id=1011 Mean: http://poj.org/problem?id=1011&lan ...

  9. 簡單SQL存儲過程實例

    簡單SQL存儲過程實例 摘自:http://blog.csdn.net/libra6956/article/details/5589173 实例1:只返回单一记录集的存储过程. 银行存款表(bankM ...

  10. csharp: WebBrowser read baidumap

    setpoint.html: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Typ ...