依稀记得刚开始学android的时候,有个功能,用户点击通知进入应用,启动一个指定的界面,之前纠结了好久,也没有整太明白如何将之前启动的一个界面从Back Stack中清除掉,那个时候英语还是比较单薄的,虽然现在依旧单薄,但是毕竟看过了那么多的文档,还是有一点点的进步了,所以今天有重新看了一下Android官方文档,较之以前又有了新的理解和感受,这里给大家进行一下共勉,也算是对之前苦逼的我一个安慰。下面言归正传。
首先介绍一下什么是Task和Back Stack
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the "back stack"), in the order in which each activity is opened.
根据官网介绍,我们可以了解到,Task 可以说是一个任务、进程或者说就是我们应用的一个生存的空间,当我们点击屏幕的ICON启动一个应用的时候,这个时候就一个相应的Task产生了,Task是一个抽象的概念,所以我们不需要太深入的去纠结他,你可以把它当作就是我们应用的生存空间,好比我们应用启动,Android就给应用分配了3分地,这3分地就是我们应用的Task。那么什么是Back Stack呢?就是我们仅有的3分地的空间,你可以想象成我们在这3分地上建了3面墙,墙中间的空间只允许占一个人,然后发生了一个这样的事情。
1、路人A进去了,那么就在最里面,我们伸头一看,哦,路人A在里面。
2、路人B又进去了,我们又伸头一看,A不见了,只看到了B(此刻我们的目光就只能看到B,只有B能够获得我们的关注,就是所谓的fouce),A此刻呢由于空间小,就什么都做不了啊,所以就待着。
3、路人C又进去了,我们再伸头一看,B和A又看不到了。
4、怎么办呢?现在我们找B有事,那我们就说:“C你出来一下,我找B有事”。(由于空间小,所以C只能慢慢悠悠的从这个小管道里面出来,这个就是“后进先出”,last in first out)
5、C出来了,我们伸头一看,嘿、看到路人B了。
6、我们问他“你知道现在几点了吗?B说我忘记带手表了,A有。”
7、我们就又让B出来了,我们再看里面,A正在那看表呢,然后说:“已经6点了。”
然后大家异口同声的说:该下班了,回家吧。大家就各自收拾,A也从里面出来了,我们就都回家了。而这3分地里面就什么都没有了。
以上介绍本来想让大家更好的理解这个事情,不过貌似介绍的优点臃肿和冗余,由于刚开始写博客不久,还请大家谅解啊。
下面就开始正经的给大家介绍一下 manifest中的<activity>节点的属性lunchMode的几个种类分别有什么不同
1、standard:这个是系统默认的,就每当我们启动一个Activity的时候,就初始化一个实例,并且将之压入Stack的顶部。同一个Activity可以被初始化多个,这个同一个指的是同一个Activity类,多个指的是多个实例,我想大家都明白。
2、singleTop: 就是说当我们要Start的这个Activity已经在Task的顶部了,那么Intent就会去调用它的onNewIntent()
函数去启动这个Activity。而不是重新初始化一个Activity实例并将它压入Stack顶部。如果这个Activity不再Stack的顶部,那么就去初始化一个并将它压入Stack顶部。同一个Activity可以有多个实例,但是只有在Stack的顶部不是此Acivity的时候才会有这个情况。
For example, suppose a task's back stack consists of root activity A with activities B, C, and D on top (the stack is A-B-C-D; D is on top). An intent arrives for an activity of type D. If D has the default "standard"
launch mode, a new instance of the class is launched and the stack becomes A-B-C-D-D. However, if D's launch mode is "singleTop"
, the existing instance of D receives the intent through onNewIntent()
, because it's at the top of the stack—the stack remains A-B-C-D. However, if an intent arrives for an activity of type B, then a new instance of B is added to the stack, even if its launch mode is "singleTop"
.这个是官方详细的解释。
3、singleTask:这个类似于singleTop,只不过将这个Activity进行转移了,当我们启动此类型的Activity的时候,会同时产生一个新的Task,并且初始化这个Activity将之作为root Activity。如果这个Activity已经存在分离出去的Task中,那么就和singleTop类似,通过Intent的onNewIntent()函数去启动这个Activity,而不是创建一个实例,就是说在分离出来的Task中,只有一个这个Activity存在。不过当启动了这个Activity的之后,用户点击返回,依旧会返回到之前的Activity。
4、singleInstance:这个就有点不好捉摸了,这个不能按照之前给出的Back Stack的先进先出来考虑,因为这个和那个思想有点违背。这个就更好理解了,就是说,这个acivity永远只存在与一个Task,却这个Task里面只有一个Acivity.
以上就暂时介绍这么多,觉得介绍的不是太准确,还请大家指正和批评。