深入理解Activity-任务,回退栈,启动模式
一、任务、回退栈的概念
一个任务是多个能够和用户进行交互并且能完成某种功能的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。
standard(标准模式)
这是系统的默认模式,也就是每次启动activity都会创建一个新的实例。需要注意的是,每个实例可以属于不同的任务栈,每个任务栈也可以对应多个实例。谁启动了该模式的activity,一个该activity的实例就会被放置到谁的任务栈中。singleTop(栈顶复用模式)
根据它的名字我们就可以想到,如果一个activity已经存在于一个任务栈中,那么系统就不会创建一个该activity的新实例,而是使用栈顶的activity实例,并且调用该activity的onNewIntent()的方法。在这种情况下,一个activity也能被实例化多次,每个实例能属于不同的任务,每个任务也能有多个实例(只有在activity在栈顶的时候,不会重新创建)singleTask(栈内复用模式)
如果一个activity存在于任务栈中,那么系统会使用该实例并且调用它的onNewIntent() 方法,这种模式下在一个任务中只能有一个实例。singleInstance(单实例模式)
这个模式除了拥有singleTask的所有特点外,在该模式下的activity实只能单独的在一个任务栈中。
深入理解Activity-任务,回退栈,启动模式的更多相关文章
- 如何正确理解和使用 Activity的4种启动模式
关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法,便于读者正确应用. Activity的启动模式有4 ...
- Android Activity的4种启动模式详解(示例)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...
- Android中Activity的四种启动模式
要了解Android的启动模式先要了解一下Activity的管理方式: 1.Activity的管理机制 Android的管理主要是通过Activity栈来进行的.当一个Activity启动时,系统根据 ...
- 安卓基础之Activity的四种启动模式
Activity的四种启动模式 Activity的启动模式在清单文件中配置: <activity ... activity:lauchMode:"..."; //有四种模 ...
- Activity生命周期以及启动模式对生命周期的影响
前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期 ...
- Android零基础入门第77节:Activity任务栈和启动模式
通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...
- Activity的四种启动模式
Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. ...
- Activity的四个启动模式
/** * Activity有四种启动模式(android:launchMode) * 分别是: * 1. standard(默认),可以不停的在栈中创建新的Activity * 2. singleT ...
- Activity的四种启动模式-图文并茂
1.对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例. 例如A启动A,A再接着启动A,A继续启动A,然后再分别出栈,如图所示 ...
- Activity的四种启动模式和onNewIntent()
转自:http://blog.csdn.net/linghu_java/article/details/17266603 Android中Activity启动模式详解 在Android中每个界面都 ...
随机推荐
- HTML5[4]:去除不必要的标签,完全使用css实现样式
1)div.span的区别,div默认是沾满一行,span默认是inline 2)去除font之类的标签
- SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework
2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...
- oracle 空间数据库说明
转:http://blog.csdn.net/jing_xin/article/details/4355642 由于最近弄一些空间数据,所以找了些oracle空间数据库的一些知识.下面是汇总: Ora ...
- Linux curl使用简单介绍
在两台新搬迁的微信服务器上执行命令: curl -H "Content-Type: application/json" -d '{"partner_no":&q ...
- Character Controller (角色控制器) 中 Move()和SimpleMove() 的区别
首先给出两者的圣典: CollisionFlagsMove(Vector3motion); Description A more complex move function taking absolu ...
- 探索jdk8之ConcurrentHashMap 的实现机制
在介绍ConcurrentHashMap源码之前,很有必要复习下java并发编程中的一些基础知识,比如内存模型等. 存储模型 并发编程中的三个概念 1.原子性 2.可见性 3.重排序 对HashMap ...
- UWP开发入门(十八)——使用ContentControl减少页面元素数量
我们今天学习一下ContentControl,主要介绍如何使用ContentControl搭配DataTemplate来进行界面的复用,以及通过ContentTemplateSelector进一步减少 ...
- hive的内部表与外部表创建
最近才接触Hive.学到了一些东西,就先记下来,免得以后忘了. 1.创建表的语句:Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_na ...
- Copy和MutableCopy
实现拷贝的方法 -copy: 1.只会产生不可变的副本对象(比如:NSString) 2.[NSMutableString copy] 产品一个不可变的nsstring对象 -mutaleCopy: ...
- mysql 64 zip download
open the url :: http://dev.mysql.com/downloads/file/?id=461109 and click the location "no tha ...