Android Intent FLAG标识

最近,好些天都在看源码,现在 对这个Intent的FLAG有一些总结。都是我自己试验的,总结的 ,可能有不对的地方,大家可以评论指出。

使用

对intent使用FLAG 大多数人都知道怎么弄。也就是调用public @NonNull Intent setFlags(@Flags int flags) 这个方法。但是如果 你同时要设定两个FLAG标识呢?
这个有两种方式可以解决。
第一种:

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_NEW_TASK);

第二种:

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_NEW_TASK);

第三种: 这种方式要注意 setFlags()要先被调用,后调用的话,会只有最后setFlags(int flags)里面参数生效。这个看源码就可以知道 setFlags会把自己的参数直接赋值给intent的mFlags。addFlags则会将自己的参数 和mFlags做 或运算 ,最后赋值给 mFlags。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

正文

FLAG_ACTIVITY_CLEAR_TASK

在这里插入图片描述

FLAG_ACTIVITY_CLEAR_TOP

在这里插入图片描述

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

在这里插入图片描述
上面这个新task栈,就得要说一下 Android管理activity使用栈来管理的。后进先出。 这个栈呢,就叫做task栈也叫任务栈。 每当你点击桌面图标时候,系统都会默认的创建一个task栈用来存放这个app的activity。 task栈可以创建多个 。一般通过FLAG_ACTIVITY_NEW_TASK或者FLAG_ACTIVITY_MULTIPLE_TASK。所以上面这个Flag,单独设置你是看不出效果的。要像下面这样:

intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS|Intent.FLAG_ACTIVITY_CLEAR_TOP);

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个标志通常不是由应用程序代码设置的,而是由系统为您设置的,如针对单任务模式的launchMode文档中所述。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

这个标志通常不是由应用程序代码设置的,而是由系统设置的,如果这个活动是从history (longpress home key)启动的。启动 已存在的和未存在的activity 不会有任何影响。

FLAG_ACTIVITY_FORWARD_RESULT

现在 有A,B,C三个activity,在A中用startActivityForResult(intent,1); 启动B activity,在B activity中 启动C activity,这时intent加 FLAG_ACTIVITY_FORWARD_RESULT(不能和startActivityForResult一起使用)。那么就会将 需要调用setResult(9999);的activity设为C。如果C不调用 setResult(9999); 那么 A activity 的回调
protected void onActivityResult(int requestCode, int resultCode, Intent data)的resultCode 为0。
B 可以有很多个。
也就是说A 需要结果启动了B,但是B不知道怎么回复,B又启动了C,让C来回复A。

FLAG_ACTIVITY_NEW_TASK

这是一个重要的标识。
在这里插入图片描述

FLAG_ACTIVITY_NEW_DOCUMENT

指定活动每次启动时都将成为新任务的根活动然后最近的任务列表中会显示同一个应用的多个activity。
在这里插入图片描述

FLAG_ACTIVITY_MULTIPLE_TASK

这个标识 能保证目标activity不会跳到目标activity已经存在的实例上面这个标志总是与FLAG_ACTIVITY_NEW_DOCUMENT或FLAG_ACTIVITY_NEW_TASK一起使用。
这两个标识和FLAG_ACTIVITY_MULTIPLE_TASK一起使用时候。就不会检查现有的task栈。总是会创建一个新的task栈 放入目标activity实例。 这样用户 永远不会回到以前的界面上。

note:如果还没有设置FLAG_ACTIVITY_NEW_TASK或FLAG_ACTIVITY_NEW_DOCUMENT中的一个,则忽略此标志。

FLAG_ACTIVITY_NO_ANIMATION

在这里插入图片描述

FLAG_ACTIVITY_NO_HISTORY

当用户离开目标 Activity 并且其在屏幕上不再可见时,是否应从 Activity 堆栈中将其移除并完成 。通俗的讲,就是你启动activityA的时候 ,加了这个flag。 当activityA启动后。你按了一下home键,回到桌面。那么activityA就会被杀死了。
也可以在activity标签 设置noHistory 属性,效果是一样的。

FLAG_ACTIVITY_NO_USER_ACTION

设置这个FLAG 以后。离开当前activity的时候 不会再调用 onUserLeaveHint()回调。

FLAG_ACTIVITY_PREVIOUS_IS_TOP

这个没搞懂,现在加这个 和不加 没区别。如果 你知道 可以告诉我。

FLAG_ACTIVITY_LAUNCH_ADJACENT

此标志仅在分屏多窗口模式下使用。新活动将显示在启动它的活动的旁边。这只能与FLAG_ACTIVITY_NEW_TASK一起使用。此外,如果希望创建现有活动的新实例,则需要设置FLAG_ACTIVITY_MULTIPLE_TASK。

FLAG_ACTIVITY_REORDER_TO_FRONT

假设现在task栈中的 activity顺序是 A,B,C,D。 D是top activity,如果设置了FLAG_ACTIVITY_REORDER_TO_FRONT,启动B。那么,将会把B 变成top。走B的 onNewIntent 周期。 其他activity 不变。 现在task栈的顺 就是A,C,D,B。

如果还指定了FLAG_ACTIVITY_CLEAR_TOP,则忽略此标志。和FLAG_ACTIVITY_CLEAR_TOP的差别是,FLAG_ACTIVITY_REORDER_TO_FRONT 不会把在它上面的activity 杀死

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

task栈重排序
这个启动器启动应用时候 会默认设置。 要和android:exported=“true”
和android:allowTaskReparenting="true"一起用,才有效果

Android会查看任何其他task栈中是否有任何与此新task栈中具有相同的taskAffinity的activity。如果找到了,那么将在另一个task栈中的实例,转移到当前这个task的顶部。
在这里插入图片描述

FLAG_ACTIVITY_RETAIN_IN_RECENTS

在这里插入图片描述

FLAG_ACTIVITY_SINGLE_TOP

如果设置,则如果activity已经在历史堆栈的顶部运行,则不会启动该活动。

FLAG_ACTIVITY_TASK_ON_HOME

在这里插入图片描述

FLAG_DEBUG_LOG_RESOLUTION

您可以启用调试的标志:设置时,将在解析此意图期间打印日志消息,以显示创建最终解析列表所找到的内容。
(没用 ,设置 不设置 log 一样的,。,,,,)

FLAG_EXCLUDE_STOPPED_PACKAGES

在这里插入图片描述
Android8.0 对静态注册的组件有了很大的限制。所以 就算不是stopped 状态 ,你也是唤醒不了的。广播限制

FLAG_FROM_BACKGROUND

可由调用方设置,以指示此意图来自后台操作,而不是来自直接用户交互。(用了没效果)

FLAG_GRANT_PERSISTABLE_URI_PERMISSION

在这里插入图片描述

FLAG_GRANT_PREFIX_URI_PERMISSION

当与FLAG_GRANT_READ_URI_PERMISSION和/或FLAG_GRANT_WRITE_URI_PERMISSION组合在一起时,URI权限授予应用,前缀和原始已授予URL匹配的任何URL。(如果没有这个标志,URI必须与要授予的访问完全匹配。)只有当方案、权限和前缀定义的所有路径段完全匹配时,另一个URI才被认为是前缀匹配。

FLAG_GRANT_READ_URI_PERMISSION

如果设置,将授予此intent的接收者对intent数据中的URI和其ClipData中指定的任何URI执行读操作的权限。
当应用于意图的剪贴数据时,所有uri以及通过数据或意图项中的其他剪贴数据的递归遍历都将被授予;只使用顶级意图的grant标志。就是当Intent 携带URI数据时候(就是文件啊,接收方可以对这个文件 进行读写)

FLAG_GRANT_WRITE_URI_PERMISSION

如果设置,将授予此意图的接收者对意图数据中的URI和其ClipData中指定的任何URI执行写操作的权限。当应用于意图的剪贴数据时,所有uri以及通过数据或意图项中的其他剪贴数据的递归遍历都将被授予;只使用顶级意图的grant标志。就是当Intent 携带URI数据时候(就是文件啊,接收方可以对这个文件 进行读写)

FLAG_RECEIVER_FOREGROUND

在这里插入图片描述

FLAG_RECEIVER_NO_ABORT

如果这是一个有序的广播,不允许接收器中止广播。他们仍然可以将结果传播给后来的接收者,但是他们不能阻止后来的接收者看到广播。

这里 有序广播 就是有优先级 这个属性的。并且发送时候 也是通过 sendOrderedBroadcast(); 方法来发送。

FLAG_RECEIVER_REGISTERED_ONLY

在这里插入图片描述

FLAG_RECEIVER_REPLACE_PENDING

在这里插入图片描述
好消息是 粘性广播已经 过时了。所以 不用看这个。

FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS

如果设置,则Instant Apps中的接收者可以看到广播。 默认情况下,Instant Apps不会接收广播。 当Instant App使用时,此标志无效。

完结,这个总结耗费了我不少时间,有一些是图片,那是因为 这些都是我OneOnte上面的。博客也只是我一部分知识的表现。