Tasks and Back Stack

地址:https://developer.android.com/guide/components/tasks-and-back-stack.html html

一个任务就是一个activity的集合,activity都被安排在一个栈里,按activity的打开顺序。android

设备home界面是大部分任务启动的地方。当用户触摸应用的启动图标或是快捷方式,应用的任务就会来到前台,若是不存在这个应用的任务,就会建立新的任务,这个应用的mainactivity将做为栈的根activity打开。ide

当当前的activity启动了另外一个,新的activity就会被放到栈的顶部,并得到焦点。而以前的activity则遗留在栈中,可是是暂停状态。当一个activtiy是暂停的,系统会保留当前用户接口的状态。当用户按了回退键,当前activity就会从栈的顶部移除,前一个activity就会恢复。当全部的activity都从栈中移除后,栈就再也不存在。ui

当用户启动一个新的任务或是跳转到home界面,以前的任务就会移到后台。在后台的时候,任务重全部的activity都是暂停的,任务的回退栈会完整保留。spa

多个任务都会保存在后台,可是若是用户运行了不少任务,系统可能会销毁后台的activity来恢复内存 。这会致使activity 的状态丢失。component

全部的activity均可以被实例化屡次,甚至是从其余任务。htm

当系统暂停你的activity,系统若是须要内存可能会彻底销毁activtiy。当这发生的时候,activity 的状态信息将会消失。为了不丢失用户的操做,你须要实现onSaveInstanceState()方法保留他。接口

若是你想要启动一个activity在新的任务中,或是要启动一个activity,想从原来已存在的activity中获取,或是用户离开任务时,除了rootactivity,其余全部activity都被清除。内存

要实现这些能够给activity设置属性和flagsci

<activity>主要有:

taskAffinity、launchMode、allowTaskReparenting、clearTaskOnLaunch、alwaysRetainTaskState、finishOnTaskLaunch

主要的intent flags有:

FKAG_ACTIVITY_NEW_TASK  FKAG_ACTIVITY_CLEAR_TOP  FKAG_ACTIVITY_SINGLE_TOP  

区别activity如何关联任务可使用<activity>的launchMode元素能够定义的类型有4种

standard(默认类型):默认,系统会建立一个新的activity实例。activity能够被实例化屡次,每一个实例能够属于很少的任务,一个任务能够有多个实例。

singleTop:若是当前任务的顶部存在这个activity实例,那么系统跳转到这个实力并调用onNewIntent()方法。不然就会建立一个新的activity实例。activity能够实例化屡次,每一个activity能够属于不一样的任务,一个任务也能够有多个实例。

singleTask:系统建立一个新的任务,而且实力化这个activity做为新的任务的根activity。然而若是activity实例存在于一个不一样的任务中,系统会跳转到这个已存在实例,调用onNewIntent()方法,而不是建立一个新的方法,只有一个activity实例能够建立。经过activity启动了一个新的任务,返回的时候仍是到上一个activity。

singleInstance:和singleTask同样,这个activity老是他的任务重的惟一一个,他启动的其余activity都是在不一样任务重。若是你启动的一个activity指定了singleTask模式,若是在后台任务重存在这个activity实例,那么这整个任务都会移到前台,

用launchMode指定的activity行为能够被flags覆盖。

FLAG_ACTIVITY_NEW_TASK:启动一个activity在一个新的任务中,若是一个任务已经运行了这个activity,那么将会把他从后台移到前台,activity会接收到onNewIntent()方法。这与singleTask很像。

FLAG_ACTIVITY_SINGLE_TOP:若是启动的activity就是当前的activity,将会调用onNewIntent()。不然就会建立一个新的activity,与singleTop很像。

FLAG_ACTIVITY_CLEAR_TOP:若是要启动的activity已经在当前的任务中运行了,不须要启动一个新的activity实例,只要恢复这个activity实例,并把他以前的activity都销毁。FLAG_ACTIVITY_CLEAR_TOP常常与FLAG_ACTIVITY_NEW_TASK配合。

affinity是activity属于任务的标志。

应用中全部的activity都有本身的affinity标志。默认一个应用中全部的activity都是属于一个任务。然而,你能够修改一个activity的affinity.不一样应用的activity能够共享一个affinity,或是同一个应用的activity能够分配不一样的任务affinities。

你能够经过<activity>的taskAffinity属性修改affinity。

taskAffinity是一个字符串,默认是包名。

affinity在两种状况下有用:

一、当启动一个activity使用FLAG_ACTIVITY_NEW_TASK标志,

启动一个activity默认都是在同一个任务中,若是带有FLAG_ACTIVITY_NEW_TASK标志,系统会在不一样的任务中查找这个acitivity。一般都是新的任务,若是某个有一样affinity的任务存在那么将会在这儿任务中启动activity。若是没有,就会启动一个新的任务。

二、当一个activity的allowTaskReparenting属性为true

用于配制是否容许activity能够更换从属的task,一般和taskAffinity一块儿使用,表示可否从启动的task移动到taskAffinity指定的任务。

相关文章
相关标签/搜索