Android Intent常用flags

1、FLAG_ACTIVITY_NEW_TASK:根据Activity 的affinity(一个app系统默认affinity的值为包名,task自身的affinity的值取决于根activity的affinity,相同affinity的activity属于同一个task)寻找task 栈,如果一个task 的 affinity与 activity 的 affinity的相同,则直接把这个栈整体移动到前台,并保持栈中的状态不变并将Activity压入栈中。如果没有找到相同的,则新建立栈,并且把activity压入栈中。

2.FLAG_ACTIVITY_CLEAR_TOP :检查栈内是否存在要启动的Activity实例,如果存在实例,这则清除此Activty上面的所有的activty,使其栈顶显示,相当于启动模式中的signleTask,该flag可以使跳转页面从onCreate方法开始执行。

例如,一个task中存在A,B,C,D四个Activity。如果D调用startActivity() 启动B,那么C和D会被finish掉并且B收到这个Intent,最后栈中只有A,B,B activity既可以在onNewIntent()中接收新的Intent,也可以将自己finish掉然后使用新的Intent重启。如果在它的launch mode中设置了"multiple"(默认),并且intent中没有设置 FLAG_ACTIVITY_SINGLE_TOP 标志,那它就会被finish掉然后重新创建。如果是其它的launchMode或者是设置了FLAG_ACTIVITY_SINGLE_TOP 属性,那就会使用现有的实例的OnNewIntent()方法来接受Intent。

这种启动模式也可以与 FLAG_ACTIVITY_NEW_TASK 一起使用:如果用来启动一个任务的root activity,它会将这个任务中现在运行的实例调到前台,然后将任务清空至只有根Activity的状态。这很有用,例如要从通知中心里启动一个Activity时。

3、FLAG_ACTIVITY_SINGLE_TOP :既启动模式中的signleTop

4、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET  :API21过期,被FLAG_ACTIVITY_NEW_DOCUMENT代替,使用此flag启动的activty以及其上的activity,会在task重置时被清除。

设置这个标志意味着在activity栈中做一个标记,在Task重置的时候栈就把从标记往上的activity都清除。也就是说,下次这个Task被通过FLAG_ACTIVITY_RESET_TASK_IF_NEEDED调到前台时(通常是由于用户从桌面重新启动),这个activity和它之上的activity都会被finish掉,这样用户就不会再回到他们,而是直接回到在它们之前的activity。

这在应用切换时非常有用。比如,Email应用会需要查看附件,就要调用查看图片的Activity来显示,那这个查看图片的Activity就会成为Email应用任务里的一部分。但是,如果用户离开了Email的任务,过了一会儿由通过Home来选择Email应用,我们会希望它回到查看邮件会话的页面,而不是浏览图片附件的页面,不然就感觉太诡异了。如果在启动查看图片Activity时设置了这个标志,那这个Activity及由它启动的Activity在下一次用户返回邮件时都会被清除。

5.FLAG_ACTIVITY_NO_HISTORY :使用此flag启动的activty不会在栈中保留。

如果设置这个标志,新的Activity就不会在历史栈中保存。用户一旦离开,这个Activity就会finish掉。也可以使用noHistory属性设置。

6.FLAG_ACTIVITY_REORDER_TO_FRONT :使用此flag启动的activity实例,如果在栈中已经存在,则会将其置于栈顶,其他实例顺序不变,比如有3个实例ABC,C位于栈顶,如果此时C通过此flag启动A实例,那么栈中实例顺序会变为BCA。

7、FLAG_ACTIVITY_CLEAR_TASK:如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。 

8、FLAG_ACTIVITY_FORWARD_RESULT:如果Activity A 在启动 Activity B时设置了这个标志,那A的答复目标目标会传递给B,这样一来B就可以通过调用setResult(int) 将返回结果返回给A的答复目标。

A的答复目标是O,如果A在启动B时使用了这个标志,A就会把答复目标O的信息传递给B,以便B将O作为它的答复目标。此时B调用setResult()时的结果信息都会传递给O,而不会给A。并且此时在A中调用setResult()的内容不会生效。我还没发现使A中setResult()生效的方法。

注意:这个标志不能与startActivityForResult()一起使用。

9、FLAG_ACTIVITY_NO_ANIMATION:禁用掉系统默认的Activity切换动画。

10、FLAG_ACTIVITY_NO_USER_ACTION

如果设置了这个标志,可以在避免用户离开当前Activity时回调到 onUserLeaveHint(). 通常,Activity可以通过这个回调表明有明确的用户行为将当前activity切出前台。 这个回调标记了activity生命周期中的一个恰当的点,可以用来“在用户看过通知之后”将它们清除,如闪烁LED灯。

如果Activity是由非用户驱动的事件(如电话呼入或闹钟响铃)启动的,那这个标志就应该被传入Context.startActivity,以确保被打断的activity不会认为用户已经看过了通知。

11、FLAG_ACTIVITY_PREVIOUS_IS_TOP

如果启动Activity时设置了这个标志,那当前这个 Activity 不会被当作顶部的 Activity 来判断是否之后新Intent应该被传给栈顶Activity而不是启动一个新的Activity。之前一个的Activity会被当作栈顶,假定当前的Acitvity会立即自己finish掉。

即 A---> B --->C,若B启动C时用了这个标志位,那在启动时B并不会被当作栈顶的Activity,而是用A做栈顶来启动C。此过程中B充当一个跳转页面。

典型的场景是在应用选择页面,如果在文本中点击一个网址要跳转到浏览器,而系统中又装了不止一个浏览器应用,此时会弹出应用选择页面。在应用选择页面选择某一款浏览器启动时,就会用到这个Flag。然后应用选择页面将自己finish,以保证从浏览器返回时不会在回到选择页面。

经常与FLAG_ACTIVITY_FORWARD_RESULT 一起使用。

12、FLAG_FROM_BACKGROUND

可以给调用者用来标识这个Intent是来自后台操作,而不是用户的交互行为。

13、FLAG_GRANT_READ_URI_PERMISSION:如果设置,Intent的接收者会被授予读权限,用来读取Intent中包含的或是在ClipData中指定的Uri。当被用于Intent中的ClipData时,被授予的是Intent中其它ClipData中的所有Uri和它们递归遍历到的Uri的读权限。只有顶级Intent中的授予标志会被使用。

14、FLAG_RECEIVER_FOREGROUND:当发送广播的时候设置了这个标志,会允许接收者以前台的优先级运行,有更短的时间间隔。正常广播的接受者是后台优先级,不会被自动提升。

15、FLAG_RECEIVER_REGISTERED_ONLY

如果发送广播时设置了这个标志,那只会调用动态注册了的接收器——BroadcastReceiver组件不会被启动。

16、FLAG_RECEIVER_REPLACE_PENDING

如果在发送广播时设置了这个标志,那新的广播会替换掉那些已存在的相同广播。相同的定义是通过Intent.filterEquals方法对两个广播的Intent处理返回true。 当匹配到相同的,新的广播和对应的接收器会将待发送的广播列表中已存在的替换掉,在列表中保留同样的位置。

这个标志通常被粘性广播(Sticky Broadcast)使用,只保证将最新的广播的值传递给接收器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值