Android四大组件之Activity<中>

来源:互联网 发布:淘宝怎么买食品 编辑:程序博客网 时间:2024/06/16 02:55
  1. 四种启动模式
    a.standard
    b.singleTop
    c.singleTask
    d.singleInstanstance
  2. 启动方式
    a.xml文件
    b.代码设置标志位
  3. Activity的Flags

一.为什么需要启动模式。在默认的情况下,我们多次启动同一个activity时,系统会创建多个实例并把它们一一放入任务栈中,当我们按back键时,会发现这些activity会一一回退,任务栈是一种”后进先出”的栈结构。多次启动同一个activity,系统会重复创建多个实例,在默认的启动模式就是这样的,这样看起来很傻。于是启动模式来了。

1.standard模式:标准模式,也是系统默认模式。每次启动一个activity都会重新创建新的实例。不管这个实例存在不存在,创建出来的实例的声明周期都符合典型的activity周期,onCreate,onStart,onResume都会调用。一个任务栈可以有多个相同的实例。每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个activity,那这个activity的就运行在启动它的那个activity所在的栈中,比如:activityA启动了activityB(B是标准模式),那么B就会进入到A所在的栈中。
如果我们使用ApplicationContext去启动stardard模式的activity时会报错,错误如下:
这里写图片描述
这里写图片描述

这是因为stardard标准模式下的activity默认会进入启动它的activity所属的任务栈中,但是由于非activity类型的context(如AppcationContext)并没有所谓的任务栈,所以出错!解决方案就是为待启动的activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建新的任务栈。这时候待启动activity实际上就是以singleTask模式启动的。后续解释。

2.singleTop:栈顶复用模式。很好理解,如果新的activity已经位于任务栈的栈顶,那么此activity不会被重新创建。同时它的onNewIntent方法会被回调。通过此参数我们可以得到请求的信息。这时该activity的oncreate.onstart不会调用。如果这个activity不位于栈顶,那么还是会创建新的实例。举个例子。目前栈内情况ABCD,D是栈顶。这个时候需要再次启动D(D启动模式是singleTop),那么栈内还是ABCD.如果D的启动模式是stardard,那么栈内是ABCDD.

3.singleTask:栈内复用模式。这是一种单例模式。只要栈内存在该activity的实例,那么多次启动activity都不会创建新的实例。和singtop一样。都会回调onNewIntent方法。并把该activity直接放到栈顶,然后把该实例的之上的activity实例会clear掉。具有clearTop的效果。

4.singleInstance:单实例模式。这个加强版的singleTask模式。除了具有singleTask特点之外。它的特性是该activity的实例只能存在一个任务栈中。除非该任务栈被销毁,否则永不会创建新的activity实例。

二.启动方式:
a.AndroidManifest.xml文件配置:
这里写图片描述
b.代码设置标志位:
这里写图片描述
注意:b方式比a方式优先级更高。两种同时存在,以b方式为准。两者在限定范围不同,如:a方式无法为activity设置FLAG_ACTIVITY_CLEAR_TOP标志。而b方式无法为activity设置singleInstance模式。

三.Activity的Flags(常用的)
1.Flag_Activity_New_Task
为Activity指定“sinlgeTask”启动模式。效果和xml配置该启动模式一样
2.Flag_Activity_Single_Top
为Activity指定“sinlgeTop”启动模式。效果和xml配置该启动模式一样
3.Flag_Activity_Clear_Top
一般会和singleTask启动模式一起出现。具有此标记位的acitivity.当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。
4.Flag_Activity_EXCLUDE_FROM_RECENTS
具有此标记的Activity将不会出现在历史Activity中。有些时候我们不希望用户通过历史列表回到我们的Activity,这个标记就有用。等同于android:excludeFromRecents=”true”;

原创粉丝点击