Mr_老冷 发表于 2023-2-22 15:07:18

【Android】Android Intent FLAG标志位解释

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 找到的信息 。比如有如下代码 :

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)用' | ' 做并且使用


mogoyu 发表于 2023-5-19 14:25:04

感谢楼主的分享

wangxiaoda 发表于 2023-8-18 16:15:16

6666:lol:lol:lol:lol:lol
页: [1]
查看完整版本: 【Android】Android Intent FLAG标志位解释