找回密码
 立即注册
老冷培训班汇总介绍老冷付费工具汇总介绍老鬼UI编程学院EasyClick所有产品简介EasyClick官方交流群
IOS授权价格IOS/安卓 自助提卡链接安卓-中控群控-电脑授权-购买IOSusb版投屏群控教程IOS脱机版激活教程
IOS脱机版wifi局域网脚本中控教程IOS脱机版wifi局域网群控投屏教程远程调试frp,兼容安卓/IOS热更新工具,兼容安卓/IOS脱机版老冷网盘
查看: 2541|回复: 2

[教程] 【Android】Android Intent FLAG标志位解释

[复制链接] |主动推送

1054

主题

135

回帖

4万

积分

管理员

【导师】

积分
40656
最后登录
2024-11-24
在线时间
1650 小时

兔年勋章金牌银牌铜牌导师微信认证热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老QQ认证EC VIP学员

发表于 2023-2-22 15:07:18 | 显示全部楼层 |阅读模式

马上注册,解锁更多高级玩法

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Android FLAG标志位解释
  • FLAG_GRANT_READ_URI_PERMISSION
    临时访问读权限 intent的接受者将被授予 INTENT 数据uri 或者 在ClipData 上的读权限。
  • FLAG_GRANT_WRITE_URI_PERMISSION
    临时访问写权限 intent的接受者将被授予 INTENT 数据uri 或者 在ClipData 上的写权限。
  • FLAG_GRANT_PERSISTABLE_URI_PERMISSION
    区别于 FLAG_GRANT_READ_URI_PERMISSION 跟 FLAG_GRANT_WRITE_URI_PERMISSION, URI权限会持久存在即使重启,直到明确的用 revokeUriPermission(Uri, int) 撤销。 这个flag只提供可能持久授权。但是接收的应用必须调用ContentResolver的takePersistableUriPermission(Uri, int)方法实现 。
  • FLAG_GRANT_PREFIX_URI_PERMISSION
    权限授予任何原始授权URI前缀匹配的URI。
  • FLAG_DEBUG_LOG_RESOLUTION
    解析intent时打印log messages,展示创建最终的resolved list 找到的信息 。比如有如下代码 :


[JavaScript] 纯文本查看 复制代码
Intent intent = new Intent(“android.provider.Telephony.SMS_RECEIVED”);
intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
sendBroadcast(intent);



将会按照优先级打印出系统所有注册”android.provider.Telephony.SMS_RECEIVED”的广播接收者。
  • FLAG_FROM_BACKGROUND
    指明Intent来自后台操作 ,不是来自用户直接互动。
  • FLAG_ACTIVITY_BROUGHT_TO_FRONT
    通常不是通过应用程序代码设置,而是通过系统如launchMode singleTask模式。
  • FLAG_ACTIVITY_CLEAR_TASK
    如果在通过Context.startActivity()启动activity时为Intent设置了此标识,这个标识将导致:任何与此activity相关联的task都会被清除。也就是说, 此activity将变成一个空栈中新的最底端的activity,所有的旧activity都会被finish掉,这个标识仅仅和FLAG_ACTIVITY_NEW_TASK联合起来才能使用。
  • FLAG_ACTIVITY_CLEAR_TOP
    当设置此标致,并且acitivity已经启动,那么不是启动一个新的activity,所有其他顶部的activity都会关闭,这个intent将被交付到(现在顶部)老的activity 做为新的intent。如果一个task由A,B,C,D组成,如果D调用startActivity(),跳到B, 然后C,D被finish掉,B接收新的intent ,结束栈中:A,B.现在运行的B的实例或者在onNewIntent方法中接收你start的新intent,或者自己finish掉然后重启一个新的intent。如果声明启动了启动模式是“multiple”(默认),并且你没有在这个intent中设置FLAG_ACTIVITY_SINGLE_TOP,就会finish掉然后重新创建。其他的启动模式。或者FLAG_ACTIVITY_SINGLE_TOP被设置了,intent将会传送到当前实例的onNewIntent方法中。这个启动模式也可以跟FLAG_ACTIVITY_NEW_TASK结合使用:如果用来start根activity,它将会在此task任务当前正在执行的实例bring to foreground,然后清除到跟状态。比如,当从notification manager启动一个activity。
  • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
    Android API21 过期,被FLAG_ACTIVITY_NEW_DOCUMENT代替。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    如果设置,新的Activity不会在最近启动的Activity的占中保存。
  • FLAG_ACTIVITY_FORWARD_RESULT
    如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。
  • FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    这个标记通常不由应用程序代码来设置,如果是从历史中启动这个Activity,系统就会设置这个标记(长按home键) 。
  • FLAG_ACTIVITY_MULTIPLE_TASK
    可以跟FLAG_ACTIVITY_MULTIPLE_TASK结合使用,当只用自己的时候相当于Manifast中android.R.attr.documentLaunchMode=”intoExisting”,当跟FLAG_ACTIVITY_MULTIPLE_TASK结合使用相当于 Manifast中android.R.attr.documentLaunchMode=”always”.
  • FLAG_ACTIVITY_NEW_DOCUMENT
    默认情况FLAG_ACTIVITY_NEW_DOCUMENT创建的document当用户关闭时之前tasks的entry会被remove掉,如果想保持在历史中一遍重新launch,就要用到这个flag.当使task的activity finish掉以后,历史entry将保持在界面以便用户重新打开类似顶级应用程序的历史。
  • FLAG_ACTIVITY_NEW_TASK
    如果设置了,这个Activity将会成为新任务历史栈的开始,如果已经有一个task运行着邀请新的activity,将不会启动新的activity;当前任务栈最后状态将会被展示在屏幕上查看FLAG_ACTIVITY_MULTIPLE_TASK ,关闭这一特性。
  • FLAG_ACTIVITY_NO_ANIMATION
    如果设置,将阻止系统get next activity的过渡动画。并不意味着一直不会有动画,如果另一个activity 的变化发生没有在start activity 显示之前指定,会有过渡动画。
  • FLAG_ACTIVITY_NO_HISTORY
    如果设置,新的activity将不会保存在历史栈中。一旦用户离开这个activity,它就会被finish掉。也可以在manifest.xml中设置activity android:hoHistory属性设置。如果设置, OnActivityResult()方法将不会再被调用 。
  • FLAG_ACTIVITY_NO_USER_ACTION
    onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。比如,在用户按下Home键,它将被调用。比如有电话进来(不属于用户的选择),它就不会被调用。如果设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。典型的,一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。 如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。
  • FLAG_ACTIVITY_PREVIOUS_IS_TOP
    如果给Intent对象设置了这个标记,并且这个Intent对象被用于从一个既存的Activity中启动一个新的Activity,这个Activity不被看作决定是否传送新的intent到top而不是start新的,通常认为使用这个flag启动的Activity会被自己立即终止。
  • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:如果设置该属性,并且这个activity在一个新的task中正在被启动或者被带到一个已经存在的task的顶部,这时这个activity将会被作为这个task的首个页面加载。这将会导致拥有这个应用的affinities的task处于一个合适的状态(移动activity到这个task或者activity从中移出),或者简单的重置这个task到它的初始状态
  • FLAG_ACTIVITY_REORDER_TO_FRONT
    如果在intent里设置交给 startActivity(),这个flag会把已经运行过的acivity带到task历史栈的顶端。例如,一个task由A,B,C,D四个activity组成,如果D携带这个flag的intent调用startActivity()打开B,那么B就会被带到历史栈的前部,结果是:A,C,D,B.如果LAG_ACTIVITY_CLEAR_TOP 被设置,那么FLAG_ACTIVITY_REORDER_TO_FRONT将被忽略。
  • FLAG_ACTIVITY_SINGLE_TOP
    如果设置了,如过Activity在栈顶将不会启动。
  • FLAG_ACTIVITY_TASK_ON_HOME
    把当前新启动的任务置于Home任务之上,也就是按back键从这个任务返回的时候会回到home,即使这个不是他们最后看见的activity,注意这个标记必须和FLAG_ACTIVITY_NEW_TASK一起使用
  • FLAG_RECEIVER_REGISTERED_ONLY
    设置这个flag,发送广播只有动态注册才能调用,组件(xml 中定义action)不会被被launch

这里有个坑点多个Flag的问题
一般情况是setFlag 如果是单个的话是没有问题的,多个的话会造成后一个Flag会覆盖前一个的问题
解决办法

使用addFlag() 或者用setFlag(Flag.1| Flag.2)用' | ' 做并且使用


VIP培训班介绍汇总[安卓/IOSusb版/IOS脱机版/PHP/nodejs等]
http://bbs.laoleng.vip/forum.php?mod=viewthread&tid=428

付费工具介绍汇总[热更/远程调试/IOS易语言UI/拓展插件等]
http://bbs.laoleng.vip/forum.php?mod=viewthread&tid=430

1

主题

24

回帖

116

积分

小白

积分
116
最后登录
2024-6-1
在线时间
5 小时
发表于 2023-5-19 14:25:04 | 显示全部楼层
感谢楼主的分享

0

主题

14

回帖

167

积分

小白

积分
167
最后登录
2024-11-5
在线时间
19 小时
发表于 2023-8-18 16:15:16 | 显示全部楼层
6666
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

想要力量吗骚年上一条 /2 下一条

关闭

免责声明|Archiver|手机版|老冷编程学院 ( 闽ICP备20013040号-2 )|网站地图

GMT+8, 2024-11-24 22:47

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表