Intent,顾名思义,即意图,通常用它来启动一个应用程序组件( Activity, Service, 或者 BroadCast Receiver )。在启动一个新的 Activity 时,可以通过给它设置不同的 Flag 标记来精确控制打开 Acitivity 的行为。

1. FLAG_ACTIVITY_SINGLE_TOP

如果栈顶已经存在一个要启动的 Activity 实例,那么不会再创建一个实例,而是回调该 Activity 的 onNewIntent() 方法。

如:栈中有 A,B,C,D,在 D 中再启动 D ,默认情况下会变为 A,B,C,D,D,而加上此标记后仍为 A,B,C,D ,而 D 的 onNewIntent() 方法会被回调到。

2. FLAG_ACTIVITY_CLEAR_TOP

当设置此标记后,如果当前运行的任务栈中有要启动的 Activity 的实例,则系统不会启动一个新的 Activity ,而是将原来的 Activity 实例顶上的 Acitivity 全部清除掉,从而使该 Activity 实例成为栈顶,并将 Intent 发送给它。

如:原来的任务栈中有 A,B,C,D 四个 Activity ,现在从 D 调用 startActivity () 方法来启动 B Activity,任务栈会变为 A,B 。

默认情况 B 会被销毁(finished)并重新创建;如果该 Intent 还设置了 FLAG_ACTIVITY_SINGLE_TOP 标记,或者 B 的启动模式(launch mode)被设置为非默认的模式(默认为 multiple),B 不会重新创建,而是接收到 onNewIntent()回调方法。

该标还可以跟 FLAG_ACTIVITY_NEW_TASK 合用。如果用来启动一个任务栈的根 Activity ,只要任何一个运行着的栈中有 Activity 的实例,系统就会将该任务带到前台,并且将此 Activity 顶上的 Activity 清除。这种方法在一些情况下非常在用,比如说当系统从通知栏启动一个 Activity 的时候。

3. Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

如果当前任务栈中有要启动的 Activity 的实例,这个标记会将此 Activity 放至栈顶。

如:原来栈中有 ABCD,从 D 通过 startActivity 启动 B,并添加 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标记,那么栈的顺序会调整为 ACDB。

注:当 Intent 中有 FLAG_ACTIVITY_CLEAR_TOP 标记时此标记被忽略。

4. FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_NEW_TASK 常在启动器(launcher)中使用。当使用 FLAG_ACTIVITY_NEW_TASK 标记启动一个 Activity 时,系统会启动一个新的任务栈,这个栈可以被放到后台或推至前台,栈中的 Activity 顺序保持不变。当再次启动这个 Activity 时,系统不会创建一个新的任务栈,而是将已经运行着的任务栈推至前台,这个任务 栈会保持之前的状态(栈中的 Activity 列表、顺序及数据等)。

5. FLAG_ACTIVITY_MULTIPLE_TASK

除非你想实现自己的启动器,否则不要使用该标记。

该标记只有跟 FLAG_ACTIVITY_NEW_TASK 合用时才有效。

FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_MULTIPLE_TASK 合用时 :
无论当前是否有一个任务栈已经运行,都会重新创建一个任务栈。因此除非你已经实现了一种方式使用户返回原来的任务,否则不要使用此标记。

6. FLAG_ACTIVITY_CLEAR_TASK

只有跟 FLAG_ACTIVITY_NEW_TASK 合用时有效。

使用该标记后,启动的的任务栈只有一个根 Activity 。

7. FLAG_ACTIVITY_TASK_ON_HOME

只有与 FLAG_ACTIVITY_NEW_TASK 合用时有效。

把当前新启动的任务置于Home任务之上,当按back键从这个任务返回的时候会回到home,即使这个不是他们最后看见的activity。

8. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

设置此标签相当于在任务栈中标记一个位置,当任务栈被重置时,从该标记位置到栈顶的 Activity 全部被清除。所谓的任务栈重置,是指当程序从后台进入前台时(通常是用户从主屏重新点击启动图标,或者从 recent apps 重新进入程序),如果栈顶的 Activity 设置了 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 标记,那么从设置 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 标记到栈顶的 Activity 会全部被清除掉。

举例:该标签可用于这种情况,用户在浏览邮件时,通过另外一个 Activity 来打开图片附件,这时用户可能会按 Home 键返回主屏,进行其它操作,一段时间后重新点击邮件的启动图标进入程序,这时应该显示邮件的内容而不是图片,因为用户可能是很长时间后返回邮件 App 的,也许已经忘记之前的操作,如果用户打开邮件后看到的是一张图片,可能会觉得很困惑。而设置 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 标记后,用户再次打开程序时,任务栈就会把图片 Activity 清除掉,显示邮件内容。

9. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

只有当新启动一个任务栈或任务栈被切换到前台时才有用,也就意味着该标记只会加在任务栈的根 Activity 上,用这个标记来表明需要重置任务栈的状态。

10. FLAG_ACTIVITY_FORWARD_RESULT

我们知道当 A Activity 想从另一个 B Activity 中获取数据时,应该使用 startActivityForResult()方法,当 B 获得结果后调用 setResult() 方法,然后将 B 关闭(finish),然后 A 会在 onActivityResult() 回调方法中接收到结果。

假设这时候 B 还需要通过另一个 C Activity 来获得 A 想要的结果,那么为了避免手动的先将 C 的结果传给 B 再传给 A,我们可以给 B 设置 FLAG_ACTIVITY_FORWARD_RESULT 标记,这样可以在 C 中调用 setResult() 方法来定义结果,当 C 跟 B 依次销毁后,A 会在 onActivityResult() 回调方法中接收到 C 中定义的结果。

需要注意的是 B 只能通过 startActivity () 方法打开 C ,否则如果 B 通过 startActivityForResult() 方法启动 C,那么 C 的结果只会传递给 B 。

11. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

该标记通常不会在应用程序代码中设置,而是当系统从 “最近应用列表” 中启动 Activity 时添加。

12. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

当在一个新任务中启动 Activity 时,此 Activity 会出现在最近应用程序 列表中(Android 2.3 及以前长按 Home 键,3.0及以后通过按多任务键)。如果设置此标记,该 Activity 就不会出现在最近程序列表中。

13. FLAG_ACTIVITY_NO_ANIMATION

当程序想从 A Activity 连续启动两个 Activity B 跟 C,可以使用此标记,系统会只显示 C 的过场动画,而不会连续出现多个 Activity 的过场动画。

14. FLAG_ACTIVITY_NO_HISTORY

设置此标记后,Activity 将不出现在任务栈的 Activity 历史中。当用户从它后一个 Activity 返回时,会直接跳到它之前的 Activity 。

15. FLAG_ACTIVITY_NO_USER_ACTION

onUserLeaveHint() 是 Activity 的一个生命周期方法,当用户操作使 Activity 进入后台时(如按下 Home 键等)会调用(时间早于 onPause() )。比如程序想要用户 “看到消息后取消通知”,就可以在该方法中得知用户已经 ”看到消息“ 了,此时可以取消通知(如闪烁的 LED 灯等)。

但在一些情况下,Activity 是系统自动启动的,比如来电界面。而使用 FLAG_ACTIVITY_NO_USER_ACTION 标记后,程序可以知道 Activity 的切换并不是用户操作的,而是系统自动启动的,onUserLeaveHint() 就不会被调用。

16. FLAG_ACTIVITY_PREVIOUS_IS_TOP

使用该标记通常表明当前 Activity 将马上将被 finish 掉,它的上一个 Activity 作为栈顶,要启动的 Activity 将以上一个 Actiivty 来决定新创建还是调用栈顶 Activity 的 onNewIntent() 方法。

17. FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个标记通常是系统使用的,当启动 lauchMode 为 SingleTask 的 Activity 时会设置该标记,应用程序中不常用。参照Android官方文档。


参考资料:

  1. Android 官方文档
  2. Android Activities and Tasks series – Intent flags
  3. new_abc的专栏

Android Intent Flags的更多相关文章

  1. Android总结篇系列:Activity Intent Flags及Task相关属性

    同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...

  2. 【转】Android总结篇系列:Activity Intent Flags及Task相关属性

    [转]Android总结篇系列:Activity Intent Flags及Task相关属性 同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http:// ...

  3. android Intent介绍

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...

  4. Activity Intent Flags及Task相关属性

    转自http://www.cnblogs.com/lwbqqyumidi/p/3775479.html 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式 ...

  5. android intent 5.1

    1.intent 6 items action, data(uri &type),Component name,Extras,flags 2.data---uri & type 不管使 ...

  6. Activity启动模式 及 Intent Flags 与 栈 的关联分析

     http://blog.csdn.net/vipzjyno1/article/details/25463457    Android启动模式Flags栈Task   目录(?)[+] 什么是栈 栈 ...

  7. [Android] Intent详解

    [转]http://www.cnblogs.com/engine1984/p/4146621.html [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重 ...

  8. 【转】Android Intent Action 大全

    String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. “android.intent.action.ADD_SHORTCUT” String ALL_APPS_AC ...

  9. 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析

    http://blog.csdn.net/vipzjyno1/article/details/25463457    在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...

随机推荐

  1. NSIS对话框单位造成的控件移位问题

    在使用NSIS脚本开发安装卸载程序,使用自定义的nsdialog控件.发现在小部分系统上安装时,一些控件会消失,或者挪位.于是排除问题,看看这些控件的为位置和坐标,发现基本上是使用了对话框单位的控件, ...

  2. ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)

    二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  3. apk逆向 - smali动态调试

    author: Dlive date: 2016/10/6 0x00 前言 ​ 之前有人问过smali的动态调试方法,其实网上已经有很多文章讲这些内容,但是为了方便大家学习,我还是写一下让大家少走点坑 ...

  4. pip install Error - ReadTimeoutError: HTTPSConnectionPool

    pip install Error OSX 终端更新pip出错 sudo pip install --upgrade pip : 1.ReadTimeoutError: HTTPSConnection ...

  5. 第一天--html

    <!Doctype html><html>    <head>        <meta charset="UTF-8">      ...

  6. js中子页面父页面方法 变量相互调用

    (1)子页面调用父页面的方法或者变量: window.parent.方法()或者变量名window.parent相当于定位到父页面  之后的操作和在父页面中写代码一样写 window.parent.a ...

  7. Web服务器与数据库服务器分离 导入 Excel数据至数据库

    一般情况一般项目WEB服务器与数据库均部署在一台服务器,文件上传,数据导入在一台服务器完成.web服务器与数据库服务器分离,文件上传与数据导入将分布在两台服务器或多台服务器之间.本案例为两台服务器,具 ...

  8. 关于 android 的setOnItemClickListener 和 setOnItemLongClickListener 同时触发的解决方法

    关于 android 的setOnItemClickListener 和 setOnItemLongClickListener 同时触发的解决方法. 其实方法也是很简单 的主要 setOnItemLo ...

  9. [转]Unicode utf8等编码类型的原理

    FROM:http://www.cnblogs.com/daxiong2014/p/4768681.html 1.ASCII码          我们知道,在计算机内部,所有的信息最终都表示为一个二进 ...

  10. October 27th Week 44th Thursday 2016

    The art of being wise is the art of knowing what to overlook. 智慧之道在于懂得该忽略什么. Always do your best. Wh ...