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. Windows HTTP Services

    原文:https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384273(v=vs.85).aspx Purpose (目的) Micr ...

  2. PLSQL note

    sql%count 最近一次sql执行的件数SUBSTR(string , int i) // i番目から最後までの文字列を切り取るSUBSTR(string , int i, int j) // i ...

  3. MVC 添加Area

    在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下: 项目 –> 添加 -> 区域 ( Area ) 输入 Admin 添加成功后 Area包含: 创建一个 ...

  4. VC 鼠标滚轮事件控制绘图的问题

    问题描述: 在MFC中绘制数据曲线,通过鼠标滚轮来进行放大缩小操作.在使用滚轮事件时,发现如果数据量较大,会出现卡顿. 解决方案: 鼠标滚轮事件会进行重复绘图,考虑在鼠标滚轮结束之后再重绘: 在鼠标滚 ...

  5. Mac系统下React Native环境搭建

    这里记录一下在Mac系统下搭建React Native开发环境的过程: 1. 安装HomeBrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.g ...

  6. 从源代码剖析Mahout推荐引擎

    转载自:http://blog.fens.me/mahout-recommend-engine/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pi ...

  7. Xcode最好用的日志打印方法

    一般打印日志都是用的系统自带的NSLog来打印的,假如项目做完了,要上线了,这些打印的日志就会很浪费性能,网上有很多的解决办法,我也是感觉网上的还是有点不方便,所以就自己又修改了一下,分享给大家. 网 ...

  8. .NET Attribute 入门【笔记】

    闲谈:没有系统的学过,偶尔看看,看的也不是很清楚. 却一直不明白,本来也不难,自己动手写了个示例.结果一目了然…… Attribute —— 标记 可以对方法.类等事务进行附着.增加属性. 下面以我见 ...

  9. Linux C编程学习之开发工具2---GDB调试器

    简介 GDB是一个功能强大的交互式程序调试工具,主要工作在字符界面下. GDB不仅可以用来调试C/C++ 语言编写的程序,还可以用来调试 Pascal.Objective-C,以及Fortran等语言 ...

  10. 收缩SQL Server数据库文件

    收缩整个数据库 DBCC SHRINKDATABASE (dbName) 收缩单个文件DBCC SHRINKFILE (FileName) 查找所有的文件名称USE dbNameEXEC sp_hel ...