Activity 的 LaunchMode

来源:互联网 发布:中国农大网络远程教育 编辑:程序博客网 时间:2024/05/19 04:07
上一章介绍了Activity的生命周期,我们对Activity 生命周期应该有了深入的了解,这一章我们讲解Activity的启动模式和标志位。

Activity 的 LaunchMode
首先说一下,Activity 为什么需要启动模式。我们知道,在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把他们一一放入任务栈,当我们单击back 键,会发现这些Activity 会一一回退。任务栈是一种“后进先出”的栈结构,这个比较好理解,每按一下back 键会有一个Activity 出栈,直到栈空为止,当栈中无任何activity 的时候,系统就会回收这个任务栈。

  1. standard : 标准模式,这也是系统的默认模式。每次启动一个Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。注意:当我们用ApplicationContext 去启动standard 模式的Activity 的时候会报错:解决这个问题的方法是为待启动Activity指定FLAG_ACTIVITY_NEW_TASK 标记位,这样启动的时候就会为它创建一个新的任务栈。

  2. singleTop : 栈顶复用模式。这种模式下,如果新Activity 已经位于任务栈的栈顶,那么此Activity 不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息,需要注意的是这个Activity的onCreate 、 onStart 、 不会被系统调用。如果新Activity 的实例已存在但不是位于栈顶,那么新Activity 仍然会重新创建。 举个例子:假设目前栈内的情况为ABCD,其中ABCD 为四个Activity , A位于栈底,D位于栈顶,这个时候假设再启动D,如果D的启动模式为singleTop,那么栈内的情况仍然为ABCD;如果D的启动模式为standard,那么由于D被重新创建,导致栈内的情况就变为ABCDD。

  3. singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity 都不会重新创建实例,和singleTop 一样,系统也会回调其onNewIntent.具体一点,当一个具有singleTask模式的Activity 请求启动后,比如 Activity A ,系统首先会寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建A的实例后把A放到栈中。如果存在A所需的任务栈,这时要看A是否在栈中有实例存在,如果有实例存在,那么系统就会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。

  4. singleInstance:单实例模式。这时一种加强的singleTask模式,它除了具有singleTask模式的特性外,还加强了一点,那就是具有此种模式的Activity只能单独地位于一个任务栈中。

0 0
原创粉丝点击