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 阅读详情

相关推荐

【论文分享】【Agent】ProAgent: Building Proactive Cooperative Agents with Large Language Models

多智能体系统是由多个智能体组成的集合,这些智能体可以是软件程序、机器人、传感器或其他实体,它们各自具备一定的智能和自主性,并通过交互协作来实现单个智能体难以完成的复杂目标。

nanxun___的博客 1121

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

java实现自动发送微信QQ消息(可发图片)

自动发送微信/QQ/微博等消息 一:功能:实现发送QQ/微信/微博消息,程序控制。 效果演示(实现自动发生QQ微信消息给女友,发微博信息也可以就不演示了) 二:原理讲解:将剪贴板的内容给发送到QQ微信中去,复制粘贴发送。 模拟真实操作进行发送信息。 三:前期准备,软件安装,及初步测试。...

XURUNFA950827的博客 1万+

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

LoRa正点原子模块组网步骤

按照我上一篇的博客和视频演示,相信大家一定都可实现了lora模块点对点的通信了。那我们来进行一个比较有高难度的设计吧! 使用多个loRa模块去完成一个组网设计: 在这之前一定要配置模块信息为定点传输 AT+TMODDE要等于1奥 第一步分析通讯协议: 点对点通讯是在透明传输的条件下,地址和信道都是一样的,直接发送接受数据。 组网呢我们利用是: 定向传输就是 A、B的地址、信道不同 假如A是要想B发送信息就用函数来下面: int b[5]...

weixin_43205178的博客 4082

基于AI Agent的数据治理实战:从架构设计到企业级落地

数据治理是确保企业数据质量、一致性与安全性的核心实践,其核心原理在于通过规范、流程与技术工具对数据进行全生命周期管理。传统人工治理模式效率低下且难以规模化,而大语言模型(LLM)与智能体(Agent)技术的发展,为数据治理的自动化与智能化带来了突破。通过将自然语言理解、任务规划与工具调用能力相结合,AI Agent能够将治理规则“代码化”与“智能化”,实现从被动响应到主动发现的模式转变。在应用场景上,AI Agent可扮演智能数据专员角色,自动执行元数据问答、数据质量探查、口径对齐等任务,显著提升数据团队效

weixin_34008805的博客 418

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

YOLOv8【第十一章:视频追踪与流处理篇·第3节】匈牙利算法(Hungarian Algorithm)与 KM 算法匹配机制详解!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 443

Android 之Activity的Flags及作用

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

1114

ESP32 DW1000 UWB 室内定位系统

详细介绍ESP32 DW1000 UWB 室内定位系统的设计演示demo。

DT程序员的博客 1662

YOLOv8的二次创新 | 结合iRMB与EMA打造全新的iEMA机制,提升动态检测性能【附保姆级代码】

YOLOv8继承了YOLO系列的轻量化和高效检测特性,同时通过改进的架构设计使得其在实时场景下具有更高的检测精度。然而,随着检测需求的增加,尤其是在动态目标检测和长时间序列检测中,YOLOv8的鲁棒性依然可以提升。通过iEMA机制的引入,我们将在这些方面进行进一步优化。iRMB模块是我们对传统Residual Block的进一步改进。通过多层特征提取,iRMB能够捕捉更多层次的特征信息,并通过引入轻量化的残差结构,提升计算效率。

一键难忘的博客 3085

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

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

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

从零实现深度学习框架【实现自己的PyTorch(已完结)】

本着“凡我不能创造的,我就不能理解”的思想,此系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。

日积月累,天道酬勤 6859

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

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

2303_80343762的博客 1347

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Activity

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

shenglong0210的博客 478

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Activity详解

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

静虚待令,有物混成 406

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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、付费专栏及课程。

余额充值