Activity 的 Flags 和 IntentFilter 匹配规则

Android —— Activity的Flags Activity的Flags有很多,本文主要介绍一些比较常用的标记位。 标记为的作用有很多,有的标记位可以指定Activity的启动模式,比如 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_SINGLE_TOP 等;还有的标记位可以影响Activity的运行状态,比如 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等。 下面,我将为大家介绍Activity常用的Flags。 FLAG_ACTIVITY 阅读详情

Activity 的 Flags

Activity 的 Flag 标记位有很多, 比如 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_SINGLE_TOP等等, 还有的标记为可以影响 Activity 的运行状态,比如 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG ACTIVITY_EXCLUDE_FROM_RECENTS等。 记录几个常用的标志位吧, 注意系统的内部使用的标记位不要去手动设置

FLAG_ACTIVITY_NEW_TASK:
为当前 Activity 指定为 SIngleTask 模式,效果和在 XML 中指定该启动模式相同。

FLAG_ACTIVITY_SINGLE_TOP:
为当前 Activity 指定为 SIngleTop 模式,效果和在 XML 中指定该启动模式相同。

FLAG_ACTIVITY_CLEAR_TOP:
具有此标记位的 Activity , 当它启动时, 在同一个任务栈中所有位于它上面的 Activity 都要出栈 ,在这种情况下, 被启动的 Activity 如果存在, 那么系统会调用它的 onNewIntent 方法,如果被启动的 Activity 采用 standerd 模式的话,那么连同它本身和它之上的 Activity 都会出栈,系统会重新创建新的 Activity 实例并且放入栈中

IntentFilter 匹配规则

Activity 的启动模式分为显示调用和隐式调用, 一般不存在同时使用2种的,如果同时使用了那么以显示调用为主, 就像广播注册, 以动态注册的优先级高, 隐式调用需要 Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息, 如果不匹配那么将无法启动 Activity, IntentFilter 中所设置的过滤信息有 action, category, data。

为了匹配过滤列表, 需要同时匹配过滤列表中的 action, category, data 等信息, 否则匹配失败, 一个过滤列表中的 action, category, data 可以有多个, 所有的 action, category, data 分别构成不同类别, 同一个类别的信息共同约束当前类别的匹配过程, 只有一个 Intent 同时匹配 action 类别, category类别, data 类别才算完全匹配, 只有完全匹配才能成功启动目标 Activity, 另外一点, 一个 Activity 可以有多个 IntentFilter, 一个 Intent 只要能匹配任何一组 intent-filter 即可成功启动对应的 Activity。

详细匹配规则:

  1. action 的匹配规则
    action 是一个字符串, 系统也有自己的 action , 当然我们也可以自己定义 action, 只有 Intent 中的 action 和过滤规则中的 action 完全相同才可以匹配成功, 一个过滤规则中可能有多个action, 那么只要匹配其中一个即可, action 还区分大小写,大小写不同也不会匹配成功

  2. category 的匹配规则
    category 和 action 不同的是如果 Intent 中含有 category, 那么 category 都必须和过滤规则中的其中一个相同, 如果 Intent 中含有多个 category, 那么所有的 category 都必须和过滤规则中的想匹配才行, 当然 Intent 中也可以不包含 category,平时我们 start 一个 Activity都没有指定 category , 那是因为系统在启动 Activity 时候默认加了一个 category: android.intent.category.DEFAULT , 同时, 如果一个 Activity 想要被隐式调用, 那么必须为它的 IntentFilter 中指定 android.intent.category.DEFAULT 。

  3. data 的匹配规则
<data android:scheme="...“ 
          android:host="..."
          android:port="..."
          android:path="..."
          android:pathPattern="..."
          android:pathPrefix="..."
          android:mimeType="..." />

data 由2部分组成, mimeType 和 URI。 mimeTyoe 指媒体类型, 比如 image/jpeg, video/*, URI 的参数就比较多了

<scheme>://<host>:<port>/<path>

scheme: URI 的模式, 比如 http, file, content等, 如果没有指定 scheme , 那么URI无效
host: URI 主机名, 比如 com.example.project, 如果未指定, URI无效。
port: 端口号
path:完整路径信息

注意, Intent 中的 URI 和 MIME 类型与过滤器中指定的 URI 和 MIME 类型进行比较。 规则如下:

  1. 仅当过滤器未指定任何 URI 或 MIME 类型时,不含 URI 和 MIME 类型的 Intent 才会通过测试。
  2. 对于包含 URI 但不含 MIME 类型(既未显式声明,也无法通过 URI 推断得出)的 Intent,仅当其 URI 与过滤器的 URI 格式匹配、且过滤器同样未指定 MIME 类型时,才会通过测试。
  3. 仅当过滤器列出相同的 MIME 类型且未指定 URI 格式时,包含 MIME 类型、但不含 URI 的 Intent 才会通过测试。
  4. 仅当 MIME 类型与过滤器中列出的类型匹配时,同时包含 URI 类型和 MIME 类型(通过显式声明,或可以通过 URI 推断得出)的 Intent 才会通过测试的 MIME 类型部分。 如果 Intent 的 URI 与过滤器中的 URI 匹配,或者如果 Intent 具有 content: 或 file: URI 且过滤器未指定 URI,则 Intent 会通过测试 URI 部分检查是否匹配。 换言之,如果过滤器只是列出 MIME 类型,则假定组件支持 content: 和 file: 数据。例如
<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

另外, 如果要为 Intent 指定完整的 data, 必须调用 setDataAndType 方法, 如果分别调用 setData 和 setType 那么他们会互相清除对方的值导致调用无效,还有 Intent-filter 的匹配规则对于 service 和 BroadcastReceiver 也是同样的道理, 只不过启动 Service 一般都是显示的调用。

最后, 通过隐式方式启动 Activity 的时候可以做判断, 检查是否有 Activity 匹配,如果不做判断可能出现 ActivityNotFoundException 了, 判断方法有2种:
采用 PackageManager 的 resolveActivity 方法或者 Intent 的 resolveActivity 方法, 如果他们找不到 匹配的 Activity 就会返回 null, 这样通过判断返回值就可以规避 ActivityNotFoundException 错误了,另外 PackageManager 还提供了 queryIntentActivities(Intent intent, int flags); 他不是返回最佳匹配的 Activity 信息而是返回所有成功匹配的 Activity 信息, 这里第二个参数 flags 使用 MATCH_DEFAULT_ONLY 标记位, 这个标记位含义是仅仅匹配那些在 intent-filter 中声明 <category android:name="android.intent.category.DEFAULT"/> 这样 category 的 Activity ,使用这个标志位可以过滤掉不含 DEFAULT 的那些 Activity, 这样 startActivity 只要匹配上就能保证成功,不含有 <category android:name="android.intent.category.DEFAULT"/> 是无法接收隐式 Intent 的。

每一个应用程序都有一组这样的 action 和 category:

        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>

这2者共同作用是用来表明这是一个入口 Activity 并且会出现在系统的应用列表内, 少了任何一个都没有任何意义的。

https://developer.android.com/guide/components/intents-filters.html

Android Activity的生命周期和启动模式 参考:《Android开发艺术探索》 1. Activity 的正常生命周期 完整的activity生命周期如下所示 生命周期的几点注意事项: Activity 第一次启动:onCreate->onStart->onResume。 Activity 切换到后台( 用户打开新的 Activity 或者切换到桌面) ,onPause->onStop(如果新 Activity 采用了透明主题,则当前 Activity 不会回调 onstop)。 Activity 从后台到前台,重新可见,o 阅读详情

相关推荐

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1644

Activity常用的Flags标记位

以下内容摘抄自作者:任玉刚所著的《Android开发艺术探索》 常用的Flags 标记位 Activity的Flags有很多,接下来介绍几种常用的标记位。 标记位有几种用途,比如设定Activity的启动模式,像FLAG_ ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP等。有的标记位可以影响Activity的运行状态,比如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS等。 其实大部分情况下,我们都不需

yanjianyang2021的博客 1698

【全开源】旅行吧旅游门票预订系统源码(FastAdmin+ThinkPHP+Uniapp)

此外,系统还会根据我的旅行计划和喜好,为我推荐合适的景点和门票,让我的旅行更加丰富多彩。旅游门票预订系统的出现,不仅简化了门票预订的流程,还提高了旅行的便捷性和效率。一款基于FastAdmin+ThinkPHP+Uniapp开发的旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统,提供前后台无加密源码,支持私有化部署。如今,有了旅游门票预订系统,这些问题都能迎刃而解。智能推荐:系统还会根据你的旅行计划和喜好,为你推荐合适的景点和门票,让你的旅行更加丰富多彩。

2401_84413757的博客 1301

Activity的标记位Flags

Activity的Flags可以设定Activity的启动模式,还可以影响Activity的运行状态,大部分情况下,我们不需要为其指定标记位,因此对于flags理解即可。 FLAG_ACTIVITY_NEW_TASK 作用:为Activity指定 “singletask”模式,其效果在XML中设置launchMode为singleTask一致 FALG_ACTIVITY_SINGLE_TOP 作用:为Activity指定 “singleTop”模式,其效果和在XML中指定launchMode为.

Humphrey0313 398

判断两个多边形是否相交(java实现)

判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景

IT_CREATE的博客 5843

Unity Spine 3.8 (URP) 踩坑(Shader报错修改)

提供了新思路,打算尝试一下URP。但美术使用的spine版本是3.8,项目用的Unity2021.3.11f1c2,直接导入spine URP包,shader报错:half4 不能转成 SurfaceData2D;Spine-Sprite-StandardPass-URP-2D.hlsl 也报这个错,也是同样的改法即可。今天搜索spine优化,看到一篇文章。

hrlr1230的博客 4564

Activity——Activity的Flags

前言:Activity的Flags有很多,这里主要分析一些比较常用的标记位。标记为的作用很多,有的标记位可以设定Activity的启动模式,比如FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP等;还有的标记位可以影响Activity的运行状态,比如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_EXCLUDE_FROM_REC

Aka的博客 758

多元相关性分析_PAST:最简便易用的统计学分析软件教程目录

欢迎来到PAST的世界!本教程并不是将PAST的所有功能均进行详细介绍,而只是挑选与生物、医学、微生物研究相关的统计学分析内容进行讲述。根据PAST内各项分析的标签分类,将该教程具体设置如下:PAST软件介绍PAST的基本信息数据的输入和修改数据的转换和标准化图像绘制 (Plot标签)点线图和直方图散点图条形图和箱须图饼图堆叠条形图三元相图气泡图单变量统计学分析 (Univariate标...

weixin_39605706的博客 3155

Android 之Activity的Flags及作用

Activity的Flags有很多,这些标记位用来设定Activity的启动模式,一般来说除一些特殊情况外不需要为Activity设置标记位 常用的几种: FLAG_ACTIVITY_NEW_TASK ◇ 这个标记位的作用是为Activity指定singleTask启动模式, 待续…… ...

1114

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2170

功能安全Safety Case构建方法论

本文系统阐述了功能安全认证中SafetyCase的构建方法。SafetyCase是一套结构化论证体系,通过Claim-Argument-Evidence(CAE)逻辑链证明系统安全性,包含系统级、技术安全级和实现级三层论证。文章详细介绍了SafetyCase的核心框架、与FMEDA等验证方法的关系、工程化实施步骤,以及常见失效模式。特别强调SafetyCase连接理论、实现与证据的桥梁作用,是功能安全认证的灵魂文件,要求将分散的安全活动组织成完整的逻辑论证。

VehSwHwDeveloper的博客 577

《Android开发艺术探索》Activity | 生命周期 | 启动模式 | Flags | IntentFilter action data的匹配规则 (一)

一:Activity的生命周期 正常情况下启动一个Activity的生命周期: onCreate、onStart、onResume、onPause、onStop、onDestory 这里说一下每一个生命周期函数的描述 onCreate 表示Activity正在创建,这这个函数中我们一般是做初始化操作比如加载布局资源 onStart 表示Activity正在启动,即将开始这...

上辈子作恶多端,这辈子写前端。 732

ABB变频器使用PROFINET IO通信模块时的激活方法

ABB变频器使用PROFINET IO通信模块时的激活方法

Robot_PLC_HMI_Automation 2731

我的Android开发笔记之Activity的生命周期和启动模式

1.onRestart()活动由不可见重新变为可见。2.onStart()此时activity已经可见,但是在后台显示。3.onResume()此时activty在前台显示4.onPause()此时activity正在停止,活动显示在后台,不能进行太耗时的操作,不然会影响新的活动的显示5.onStop()此时activity即将停止,可以做一些稍微重量级的操作。6.onStart()和onStop()与onResume()和onPause()的区别在与前者为是否显示,后者是否显示在前台。

2303_80343762的博客 1347

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Activity

再谈Activity 目录 生命周期 正常生命周期 非正常生命周期 Activity的启动模式 Activity的LaunchMode Activity的Flags IntentFilter的匹配规则 附加 生命周期 正常的生命周期 onCreate()->onStart()->onResume()->onPause()->onStop()->onDe...

shenglong0210的博客 478

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Activity详解

1 Activity生命周期 官方解释: onPause 和 onResume 可以理解为是前台与后台 Activity 之间的切换,onPause 切记不可做耗时操作(哪怕稍微复杂的逻辑) onSavaInstanceState的调用时机: 非主动退出 Activity中如果有Fragment,在重建的时候做好判断 onPostCreate:在 onCrate 和...

静虚待令,有物混成 406

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android开发读书笔记,Android开发艺术探索读书笔记(一)

第1章 Activity 的生命周期和启动模式生命周期普通生命周期Android生命周期1.第一次启动:onCreate -> onStart -> onResume2.切换:onPause -> onStop若新Activity采用透明主题,则当前Activity不会回调onStop3.再次切回:onRestart -> onStart -> onResume4.b...

weixin_29544469的博客 335

Android四大组件之一——Activity

Activity是Android四大组件中最重要的一个,相关知识也错综复杂,此篇记录学习及工作中Activity的相关知识。 文章目录Activity生命周期 Activity生命周期

libolf的博客 372

Activity的生命周期和启动模式

本文为Android开发艺术探索一书的第一章总结。

oyyming的博客 367

Android进阶知识(二):Activity启动模式进阶之多任务栈与Flags

Android进阶知识(六):Activity启动模式进阶之多任务栈与Flags 一、Activity启动模式进阶之多任务栈 在笔记Android基础知识(三):Android四大组件简介中曾经提到过,Android系统是一个多任务的操作系统,而任务即为Activity中的栈,由一个或多个Activity组成。 在基础知识的笔记中提到的Activity返回栈,除了特殊的singleInstance...

weixin_38196407的博客 1946

【读书笔记】【Android 开发艺术探索】第1章 Activity 的生命周期和启动模式

一、Activity 的生命周期分析             典型情况下的生命周期和异常情况下的生命周期。            1、典型情况下的生命周期   onCreate : 表示 Activity 正在被创建。在这个方法做一些初始化的工作;  onRestart : 表示 Activity 正在重新启动。 一般情况下,Activity 从不可见变成可见状态时,回调用; onSta

yxhuang2008的专栏 719

Activity生命周期和启动模式

1.生命周期http://blog.youkuaiyun.com/lxj1137800599/article/details/50353728 这篇文章已经介绍了生命周期,概括下来就是下面这幅图 2.启动模式 (1)standard:标准模式。每次激活Activity时,都创建Activity实例,并放入任务栈,不管这个实例是否存在 (2)singleTop:栈顶复用模式。如果就是该Activit

lxj1137800599的专栏 510

Android基础 | 关于Activity你应该明白的一切

Activity 作为一个老生常谈的话题,它是我们刚接触Android开发就遇到,虽然已有一段时间开发经验,但谈起完全搞懂Activity相关,不敢妄言,故结合个人理解及书籍参考,简单总结一下 Activity基础相关知识,其中也留出了一些有意思的问题。 大体的脑图如下(启动流程涉及的过多,暂时放在后期): Activity生命周期 基础的生命周期方法这里就不做解释了,大家刚开始接触时就...

petterp的博客 1107

深入理解Activity的生命周期和启动模式

Activity的生命周期全面分析 异常情况下的生命周期分析 总结: 1.系统只有在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会触发这个过程。 2.当我们在onSaveInstanceState中存储一个字符串,然后当Activity被销毁并重新创建后,接收位置可以选择在onR...

qq_36828822的博客 528

Activity 任务栈和它的启动模式

文章目录Activity 的 LaunchMode Activity 的 LaunchMode

csdn1225987336的专栏 591

activity finish后没有destroy_Activity 基础知识点

Activity 的生命周期典型情况下的生命周期典型情况下的生命周期,指的是在有用户参与的情况下,Activity 所经历的生命周期的改变。// Activity第一次启动 onCreate -> onStart -> onResume // 被新的Activity覆盖或者Home键返回桌面 // 新的Activity主题透明或者对话框样式,只会调用onPause onPause -...

weixin_39579127的博客 889
上一篇: Activity 生命周期 启动模式
下一篇: Android View 事件分发机制
CoderYue
博客等级 码龄11年 201粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值