一、taskAffinity属性?
这个 taskAffinity表示一个任务,这个任务就是当前activity所在的任务
二、优先级
如果一个activity在清单文件设置了launchemode,这时候startactivity启动该activity,并且设置了intent的启动flag,这个时候系统优先选择flag。
二、flag启动模式
1、FLAG_ACTIVITY_NEW_TASK
重点掌握
注:应用广泛
例如:打开别的应用
1.1概念:通常,这个标志会启用一个新的Task。然而,并不是必须是。如果已经存在一个Task与新Activity的affinity相同,这个Activity就会加入到那个Task中。如果不是,启动一个新的Task。
1.2特点:系统默认所有的activity的taskaffinity属性值都相同
2、FLAG_ACTIVITY_CLEAR_TOP(同一个应用)
重点掌握
注:应用广泛
例如:做返回、动态更新ui显示
2.1 场景:Activity A, Activity B, Activity C和Activity D在同一个应用中.
2.2 操作:Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A
中启动Activity B(堆栈状态: AB), 在ActivityB中启动Activity C(堆栈状态: ABC),在ActivityC中启动ActivityD(堆栈状态: ABCD), 在ActivityD中启动Activity B,启动Activity B的Intent的Flag设置为FLAG_ACTIVITY_CLEAR_TOP, (堆栈状态: AB).
3、FLAG_ACTIVITY_BROUGHT_TO_FRONT(带到前面--不同的应用)
注:基本上不怎么使用 当一个activity设置了singleTask,那么系统会默认的给我们的intent设置 当前这个flag
3.1场景: Activity A在名称为"TaskOne应用"的应用中, Activity C和
Activity D在名称为"TaskTwo应用"的应用中.
3.2操作:在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态: A),在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,Android系统会为Activity C开僻一个新的Task,命名为TaskB(TaskB堆栈状态: C), 在ActivityC中启动Activity D(TaskB的堆栈状态: CD),长按Home键,选择TaskA,Activity A回到前台,在Activity A中再次启动Activity C,在启动Activity C的Intent中设置Flag为FLAG_ACTIVITY_BROUGHT_TO_FRONT,TaskB回到前台,Activity C显示, (TaskB的堆栈状态: C).
4、FLAG_ACTIVITY_MULTIPLE_TASK:(多个)
注:很少使用
与FLAG_ACTIVITY_NEW_TASK结合使用,首先在Intent中设置
FLAG_ACTIVITY_NEW_TASK,打开Activity,则启动一个新Task,接着在Intent中设置FLAG_ACTIVITY_MULTIPLE_TASK,再次打开同一个Activity,则还会新启动一个Task.
5、 FLAG_ACTIVITY_SINGLE_TOP:
重点掌握
注:应用广泛
例如:QQ消息界面
概念:如果当前栈顶的activity就是要启动的activity,则不会再启动一个新的activity
6、FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
一般与FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET结合使用,如果设置该属性,这个activity将在一个新的task中启动或者或者被带到一个已经存在的task的顶部,这时这个activity将会作为这个task的首个页面加载。将会导致与这个应用具有相同亲和力的task处于一个合适的状态(移动activity到这个task或者从中移出),或者简单的重置这个task到它的初始状态
7、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:
在当前的Task堆栈中设置一个还原点,当带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求启动这个堆栈时(典型的例子是用户从桌面再次启动这个应用),还原点之上包括这个应用将会被清除。应用场景:在email程序中预览图片时,会启动图片观览的actvity,当用户离开email处理其他事情,然后下次再次从home进入email时,我们呈现给用户的应该是上次email的会话,而不是图片观览,这样才不会给用户造成困惑。
例:存在ActivityA, Activity B, Activity C, Activity A启动开僻Task堆栈,
命名为TaskA(TaskA堆栈状态: A),在ActivityA中启动ActivityB(TaskA 堆栈状态: AB),接着Activity B启动Activity C(TaskA堆栈状态: ABC),启动Activity C的Intent中设置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标题,这样TaskA中有一个还原点,当有包FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求TaskA堆栈时(比如请求ActivityA)系统就会将还原点以上的Activity清除, TaskA堆栈中只剩下了AB.
8、FLAG_ACTIVITY_NO_ANIMATION:
重点掌握
注:自己配置的动画不会被屏蔽
例如:不想要系统默认启动
如果给Intent对象设置了这个标记,那么将会阻止系统在Activity间切换的动画变换。
9、FALG_ACTIVITY_NO_HISTORY:
注:偶尔使用
例如:1、提交界面(当我们提交成功之后,我们需要调转到新的界面)
2、当我们的activity没有往下执行的操作(末级activity)
如果给Intent对象设置了这个标记,那么新的Activity将不会被保留在历史堆栈中
10、FLAG_ACTIVITY_NO_USER_ACTION:
重点掌握
注:比较常用
特性:用来控制onUserLeavehint是否被调用
场景:比如我们的通话拨号、闹钟程序
可以在onUserLeavehint方法中发送广播,关闭通知栏上的通知
如果给Intent对象设置了这个标记,在新启动到前台的Activity被挂起之前,它会阻止
普通的onUserLeaveHint()方法的回调。如:电话拨号或闹钟程序就要使用这个标记来启动Activity。
11、FLAG_ACTIVITY_PREVIOUS_IS_TOP:
注:很少使用(几乎不怎么使用)
如果给Intent对象设置了这个标记,并且这个Intent对象被用于从一个既存的Activity中启动一个新的Activity,这个Activity不能用于接受发送给顶层Activity的新的Intent对象,通常认为使用这个标记启动的Activity会被自己立即终止。
12、FLAG_ACTIVITY_REORDER_TO_FRONT:
重点掌握
注:如果我们这个activity设置了该flag,那么将会导致历史堆栈中如果存在这个activity,这个时候就会被带到前台
场景
如果给Intent对象设置了这个标记,那么将会导致任务历史堆栈中既存的Activity被带到前台。
13、FLAG_ACTIVITY_TASK_ON_HOME:
把当前新启动的任务置于Home任务之上,也就是按back键从这个任务返回的时候会回到home,即使这个不是他 们最后看见的activity
注意这个标记必须和FLAG_ACTIVITY_NEW_TASK一起使用。
整理自教程