Intent filter 关于Action、Category属性详解---附带实例源码

面试必备:Android意图过滤器(Intent Filter)的底层实现原理 在Android开发中,组件(Activity/Service/BroadcastReceiver)之间的通信主要通过Intent完成。其中,「隐式Intent」(不明确指定组件类名的Intent)的核心机制就是「意图过滤器(Intent Filter)」——它决定了哪些组件可以响应你的请求。Intent与Intent Filter的关系系统如何完成意图匹配(底层匹配规则)PackageManagerService对Filter的存储机制面试中高频的「匹配失败排查」技巧。 阅读详情
如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢? Intent Filter就是 用来注册 Activity 、 Service 和 Broadcast Receiver 具有能在某种数据上执行一个动作的能力。 使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。

为了注册一个应用程序组件为 Intent 处理者,在组件的 manifest 节点添加一个 intent-filter 标签。在 Intent Filter 节点里使用下面的标签(关联属性),你能指定组件支持的动作、种类和数据。

1、动作测试:

[java]  view plain copy
  1. <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">     
  2.     <intent-filter>  
  3.         <action android:name="myapp.action.test1" />  
  4.         <category android:name="android.intent.category.DEFAULT" />    
  5.     </intent-filter>  
  6. </activity>  

规则a.一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。

[java]  view plain copy
  1. <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">     
  2.     <intent-filter>    
  3.         <category android:name="cate1"/>  
  4.         <category android:name="cate2"/>  
  5.         <category android:name="android.intent.category.DEFAULT" />    
  6.     </intent-filter>  
  7. </activity>   

以上<intent-filter>元素没有包含<action>标签,任何Intent请求都无法与该<intent-filter>匹配。

规则b.如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。

[java]  view plain copy
  1.         <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">     
  2.             <intent-filter>  
  3.                  <action android:name="myapp.action.test1" />  
  4.                  <action android:name="myapp.action.test2" />  
  5.                  <action android:name="myapp.action.test3" />  
  6.                 <category android:name="android.intent.category.DEFAULT" />    
  7.             </intent-filter>  
  8.         </activity> <span style="color:#ff0000">  
  9. </span>  
以下几种Intent请求都可以通过上述<intent-filter>的动作测试。

请求1:

[java]  view plain copy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. startActivity(intent);  
请求2:

[java]  view plain copy
  1. Intent intent = new Intent("myapp.action.test2");  
  2. startActivity(intent);  
如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。

(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。

2、类别测试

[java]  view plain copy
  1. <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">     
  2.           <intent-filter>    
  3.               <action android:name="myapp.action.test1" />  
  4.               <category android:name="cate1"/>  
  5.               <category android:name="cate2"/>  
  6.               <category android:name="android.intent.category.DEFAULT" />    
  7.           </intent-filter>  
  8.       </activity>  
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。

以下三种Intent请求都可以通过上述<intent-filter>的类别测试。

请求1:

[java]  view plain copy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. intent.addCategory("cate1");  
  3. startActivity(intent);  
请求2:
[java]  view plain copy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. intent.addCategory("cate2");  
  3. startActivity(intent);  

请求3:

[java]  view plain copy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. intent.addCategory("cate1");  
  3. intent.addCategory("cate2");  
  4. startActivity(intent);   

实例部分源码:

AndroidManifest.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.x210.intentfilters"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="9"  
  9.         android:targetSdkVersion="9" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.x210.intentfilters.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.                 <category android:name="android.intent.category.LAUNCHER" />  
  22.             </intent-filter>  
  23.         </activity>  
  24.         <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">     
  25.             <intent-filter>  
  26.                 <action android:name="myapp.action.test1" />  
  27.                 <action android:name="myapp.action.test2" />  
  28.                 <category android:name="android.intent.category.DEFAULT" />    
  29.             </intent-filter>  
  30.         </activity>  
  31.         <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">     
  32.             <intent-filter>    
  33.                 <action android:name="myapp.action.test1" />  
  34.                 <category android:name="cate1"/>  
  35.                 <category android:name="cate2"/>  
  36.                 <category android:name="android.intent.category.DEFAULT" />    
  37.             </intent-filter>  
  38.         </activity>  
  39.     </application>  
  40.   
  41. </manifest>  
MainActivity.java(核心代码)
[java]  view plain copy
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.main);    
  4.         actionbutton = (Button) findViewById(R.id.ActionButton);  
  5.         categorybutton = (Button) findViewById(R.id.CategoryButton);  
  6.         actionbutton.setOnClickListener(new View.OnClickListener() {  
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 Intent intent = new Intent("myapp.action.test1");  
  10.                 startActivity(intent);  
  11.             }  
  12.         });  
  13.         categorybutton.setOnClickListener(new View.OnClickListener() {        
  14.             @Override  
  15.             public void onClick(View v) {  
  16.                 Intent intent = new Intent("myapp.action.test1");  
  17.                 intent.addCategory("cate1");  
  18.                 intent.addCategory("cate2");  
  19.                 startActivity(intent);  
  20.             }  
  21.         });  
  22.     }  

特别提醒实例源码(免费):http://download.youkuaiyun.com/detail/a13429921973/5720603

原文链接:http://blog.youkuaiyun.com/andie_guo/article/details/9271973

SKILL 是什么?怎么做?五分钟 带你从入门到精通 skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。 阅读详情

相关推荐

同花顺自动化交易避坑指南:pywinauto实战中验证码识别与界面弹窗处理

本文深入探讨同花顺自动化交易中的关键稳定性问题,重点解决验证码识别与弹窗处理两大难题。通过优化Tesseract OCR、整合打码平台API以及设计pywinauto弹窗监控体系,提供了一套完整的自动化交易解决方案,帮助交易者有效规避资金账户和持仓信息操作中的常见陷阱。

weixin_33734785的博客 486

Android基础之intent-filter、action、category标签使用

待续

钝悟需要时间的打磨,顿悟需要时间的积累 4756

如何区分Info与CoWoS封装?

这篇文章主要从Info、CoWoS封装的定义、Interposer的种类以及Info、CoWoS封装的种类三方面进行了介绍,希望读者能够有所收获

wangyubo1的博客 7938

Intent filter 关于Action、Category属性详解 & 程序启动如何决定哪个是第一个启动的组件。

大部分转载: 这个讲的很清楚。 http://blog.youkuaiyun.com/andie_guo/article/details/9271973 Intent filter 关于Action、Category属性详解---附带实例源码 如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢? Intent Filter

fengyunjh6的专栏 930

Kettle实战:如何用JavaScript脚本实现数据库表批量操作(附完整代码)

本文详细介绍了如何利用Kettle的JavaScript脚本实现数据库表批量操作,包括表名采集、循环遍历和动态SQL生成等关键步骤。通过实战案例和完整代码示例,帮助ETL工程师高效处理数据密集型任务,提升数据库操作的自动化水平。

weixin_29019241的博客 231

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2417

Intent filter 关于Action、Category属性详解

说几句俗话: 对应Activity,Service等四大组件在AndroidManifest.xml中设置Action的值,相当于对外,包括对其他app暴露自己是可以被外面调用,为其他组件(或者app)服务的,其他组件(或app)使用: Intent intent=new Intent(); intent.setAction(Action字符窜[intent.name]); st...

FLY_THINK2012的博客 402

Codesys电子凸轮Cam表实战:从可视化配置到程序化构建

本文详细介绍了Codesys电子凸轮Cam表的实战应用,从可视化配置到程序化构建的全过程。通过包装机和印刷机案例,解析Cam表的基础设置、调试技巧及动态构建方法,帮助工程师快速掌握电子凸轮技术,提升运动控制精度和效率。

weixin_29309785的博客 298

IntentFilter匹配规则

匹配三要素:action、category、data **action:**提供隐式方式启动的组件,其IntentFilter中至少声明一个自定义action,自定义action的值可以是系统提供的一些默认值,也可以是自定义的任何字符串。在android意图匹配过程中,首先匹配的对象既是action,通过遍历action注册列表,找到声明了该action的IntentFilter匹配对象,因此期望隐式启动组件的intent,其action属性必须匹配上目标IntentFilter声明的一个action。 *

qq_43044875的博客 279

改进的U-Net在视网膜血管分割上的应用

为了提高算法在血管边界的分割能力,在编码部分采用全局卷积网络(GCN)和边界细化(BR)替换传统的卷积层;在跳跃连接部分引入改进的位置注意模块(PA)和通道注意模块(CA),目的是增加血管与背景之间的对比度,使网络更好地将血管与背景分割开;此外,为了提高网络的性能,在编码部分的最后一层使用密集卷积网络解决网络过拟合问题,同时为了在一定程度上解决梯度爆炸、梯度消失的问题,在解码部分的每一层使用卷积长短记忆网络提升网络获取特征信息的能力。替换传统的卷积操作来解决血管边界非血管像素误分为血管的问题。

weixin_70923796的博客 783

EuROC 数据集格式及相关代码

Euroc提供ROS和zip两种数据格式。

~勿据散客~的博客 2093

category中intent-filter介绍

一、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent 1、显式启动 显式启动是我们日常开发中必不可少,基本上每天都会写的 Intent intent = new Intent(MainActivity.this,OtherActivity.class); startActivity(intent); 2、隐式启动 ...

grandgrandpa的博客 1719

05 SAP CPI 访问第一个CPI接口

其中的clientid的值可作为Basic验证的用户名,clientsecret的值可作为Basic验证的密码。点击SEND按钮,可看见返回状态为200 OK。在04中,我们得到TOKEN令牌。POSTMAN向下滚动。点击按钮获取token。

SAP CPI 662

Android中Intent的Action、Category属性与intent-filter配置

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。 Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加信息。通常Action属性会与...

孤云博客 4784

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

3.1、组件activity_intent、intent-filter、Context详解

源码地址:https://github.com/ldy1993/ToolforAS.git 这一节,我们尽量理解activity_intent、intent-filter、Context的原理。如果是初学者可以了解一下AndroidManifest.xml中activity标签下intent-filter对启动activity的意义。 1.1、activity的启动方式和意图 ...

刘东阳的博客 1501

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android中Intent对象与Intent Filter过滤匹配过程详解

如果对Intent不是特别了解,可以参见博文《Android中Intent概述及使用》,该文对本文要使用的action、category以及data都进行了详细介绍。如果想了解在开发中常见Intent的使用,可以参见《Android中常见Intent习惯用法-上篇(附源码下载)》。 本文内容有点长,希望大家可以耐心读完。 本文在描述组件在manifest中注册的Intent Filter过滤器...

王温暖的博客 758

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android基础——Intent

IntentIntent是什么?显式Intent隐式Intent Intent是什么? Intent用于Android程序中各组件(Activity、BroadcastReceive、Service)的交互,并且可以在组件之间传递数据,分为显式Intent和隐式Intent。 显式Intent 通过Intent(Context packageContext, Class<?> cls)构造函数创建Intent实例,第一个参数为当前Context,第二个参数为要启动的目标类。如当需要启动Other

松仔Log的博客 3340

Intent Filter

我们都知道,Intent 可以分为两种类型,分别为显式和隐式。 显示的调用也就是常使用的: Intent intent = new Intent(context,Activity.class); startActivity(intent); 而隐式调用我们却很少用到,这是因为在我们自己的项目中,我们能够精准的控制可以跳转到的页面,所有的跳转都可以通过显式的Intent来完成,那么,当我们想要启动一个系统的界面,而我们又不知道这个系统界面的名称的时候,这个时候我们就会用到IntentFilter。 Inte

kkk96291的博客 2731

Intent Filter match过程源码分析

主流程 主线流程:先match action, 再match data, 最后match category 时序图 简化后的代码public final int match(String action, String type, String scheme, Uri data, Set<String> categories, String logTag) { if (acti

cheyiliu的专栏 2483

intent-filter匹配规则,是时候了解一波了

一个intent-filter中action、category、data的数量均可超过一个,在进行匹配时,可以理解为这些aciton、category、data会随机组合,只要匹配其中一组即可,换言之,只要intent中的action、category、data均在intent-filter中即可; intent-filter在一个Activity中可以存在多个,进行匹配时,只需要完全匹配...

xiaok的博客 3171

Android Intent Filter原理与面试解析

Intent Filter是Android组件间通信的核心机制,通过定义Action、Category和Data三要素,实现组件能力的声明与匹配。其底层原理涉及PackageManager的组件数据库管理和IntentResolver的匹配算法,是Android系统实现隐式Intent调度的关键技术。在应用开发中,合理使用Intent Filter能实现灵活的组件调用,但需注意性能优化和安全问题。本文深入解析Intent Filter的匹配流程、系统服务交互机制以及常见面试问题,帮助开发者掌握这一Andro

weixin_28432777的博客 323

Android Intent Filter底层原理与面试解析

Intent Filter是Android组件通信的核心机制,通过声明式匹配规则实现组件间的动态发现。其工作原理基于Action、Data和Category三个维度的匹配逻辑,其中Data匹配涉及复杂的URI结构和MIME类型处理。在系统层面,PackageManagerService通过哈希索引和延迟解析等优化手段提升匹配效率。作为Android开发高频面试点,深入理解Intent Filter的底层实现有助于解决实际开发中的组件启动失败、Intent劫持等典型问题。特别是在Android 11+的包可见

weixin_29174013的博客 345

Android Intent Filter机制解析与面试要点

Intent Filter是Android组件通信的核心机制,作为基于声明的动态路由系统,它实现了应用间的灵活交互。其工作原理涉及Action、Data、Category和Extras四维匹配规则,系统通过PackageManagerService建立哈希映射和前缀树索引来优化匹配效率。在工程实践中,合理使用Intent Filter能实现类似微信分享的动态功能适配,但需注意性能损耗和安全风险。面试常考察的exported属性、隐式Intent匹配流程等问题,本质上都是对系统级设计trade-off的理解。

weixin_29165465的博客 304
上一篇: 在Ubuntu 12.04安装和设置Samba实现网上邻居共享
下一篇: python 函数参数的传递(参数带星号的说明)
hookfeng
博客等级 码龄12年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值