赞
踩
最近,好些天都在看源码,现在 对这个Intent的FLAG有一些总结。都是我自己试验的,总结的 ,可能有不对的地方,大家可以评论指出。
具体的修改说明,
声明为前台广播,比后台广播快
myIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
指定的应用可以接收。如果需要作为全局广播则去掉
myIntent.setPackage(“com.test.mypackage”);
使用
对intent使用FLAG 大多数人都知道怎么弄。也就是调用public @NonNull Intent setFlags(@Flags int flags) 这个方法。但是如果 你同时要设定两个FLAG标识呢?
这个有两种方式可以解决。
第一种:
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_NEW_TASK);
1
第二种:
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_NEW_TASK);
1
第三种: 这种方式要注意 setFlags()要先被调用,后调用的话,会只有最后setFlags(int flags)里面参数生效。这个看源码就可以知道 setFlags会把自己的参数直接赋值给intent的mFlags。addFlags则会将自己的参数 和mFlags做 或运算 ,最后赋值给 mFlags。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
1
2
正文
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);
1
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上面的。博客也只是我一部分知识的表现
————————————————
版权声明:本文为CSDN博主「知我饭否」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a1064072510/article/details/85265325
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。