显示Intent和隐式Intent以及IntentFilter匹配规则

简介: 显示Intent我相信显示Intent大家已经使用的非常熟练了,此处不再过多阐述。


一:显示Intent



我相信显示Intent大家已经使用的非常熟练了,此处不再过多阐述。


button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,FirstActivity.class);
                startActivity(intent);
            }
        });


我们先讲IntentFilter匹配规则然后在讲隐式Intent,会比较容易理解。


二:IntentFilter匹配规则



IntentFilter中的过滤信息包括action,category,data

如有要匹配过滤列表,就要同时匹配过滤列表中的action,category,data信息,否则匹配失败。一个Activity可以存在多组IntentFilter,只要Intent匹配其中一组即可,一组IntentFilter也可以存在多个action,category,data


1.action匹配规则

action是一个字符串,系统有预定义的,我们也可以自己定义。

匹配规则:一组IntentFilter可以有多个action,只要Intent中的action与IntentFilter中的任一一个action匹配成功,则成功,匹配成功是指字符串相同。字符串区分大小写,如果Intent没有指定action也会匹配失败


2.category匹配规则

category是一个字符串,系统有预定义的,我们也可以自己定义。

Intent可以不指定category也会匹配成功,因为系统会在调用startActivity的时候默认为Intent加上android.intent.category.DEFAULT,但如果Intent指定了category就必须和IntentFilter中的category匹配,否则匹配失败


3.data匹配规则

data的构成由mimeType和URI组成。

mimeType指媒体类型,比如图片,视频,音频等

URI结构如下:

<scheme>://<host>:<port>/[<path> | <pathPrefix> | <pathPattern>]

scheme:URI的模式,比如http,file等,如果没有指定scheme,则URI的参数无效,也就是URI无效。

host:URI的主机名,如果没有指定host,则URI的参数无效,也就是URI无效。

port:端口号,只有scheme和host存在且合理,Port才有意义

path:完整路径

pathPrefix:路径的前缀信息

pathPattern:完整路径,可含通配符


匹配规则:

Intent必须指定data,而且必须与IntentFilter中的任意一个data匹配成功,才有意义。

如果我们单独指定了mimeType,不知道URI也能匹配成功,因为URI的默认值为content和file


三:隐式Intent



隐式Intent需要明确指点组件信息。隐式Intent需要匹配IntentFilter中设置的过滤信息

我们首先在清单文件中自定义action和categroy(记住可以自定义没意义的action和categroy,只要和Intent匹配就可以)

<activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="com.example.implicit.Activity"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <category android:name="com.example.implicit.FirstActivity"/>
        </intent-filter>
        </activity>

然后我们在ManActivity中隐式Intent

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.implicit.Activity");
                intent.addCategory("com.example.implicit.FirstActivity");
                startActivity(intent);
            }
        });

预定义Action和Category属性值

Action和category的值可以自定义,Android系统也提供了许多预定义的常量值,用于启动系统预定义的Activity、Service。

下面我们介绍一些预定义的指

Action常量            对应的字符串                    说明
ACTION_MIAN    android.intent.action.MAIN        应用程序入口  
ACTION_VIEW    android.intent.action.VIEW        显示指定数据
ACTION_EDIT    android.intent.action.EDIT        编辑指定数据
ACTION_DIAL    android.intent.action.DIAL        显示拨号面板
ACTION_CALL    android.intent.action.CALL        向指定用户打电话
ACTION_SEND    android.intent.action.SEND        向其他人发送数据
ACTION_SENDTO  android.intent.action.MESSAGE     向其他人发送消息
ACTION_ANSWER  android.intent.action.ANSWER        应答电话
ACTION_INSERT  android.intent.action.INSERT        插入数据
ACTION_DELETE  android.intent.action.DELETE        删除数据
ACTION_RUN     android.intent.action.RUN           运行数据
ACTION_SYNC    android.intent.action.SYNC          用户数据同步
ACTION_PICK_ACTIVITY android.intent.action.PICK_ACTIVITY  选择Activity
ACTION_SEARCH  android.intent.action.SEARCH        执行搜索
ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH 执行Web搜索
Intent类中与Category相关的常量值列表
Category            常量对应的字符串                           说明
CATEGORY_DEFAULT    android.intent.category.DEFAULT           默认的Category
CATEGORY_TAB        android.intent.category.TAB指定Activity   作为TabActivity的Tab页
CATEGORY_LAUNCHER   android.intent.category.LAUNCHERActivity  显示在顶级程序列表中
CATEGORY_INFO       android.intent.category.INFO              用于提供包信息CATEGORY_HOMEandroid.intent.category.HOME设置该Activity随系统启动而运行
CATEGORY_PREFERENCE android.intent.category.PREFERENCE       设置Activity是参数面板



相关文章
|
3月前
|
Android开发
android基础:Intents 和 intent-filter 的匹配规则
这篇文章详细解释了Android开发中Intent和<intent-filter>的匹配规则,包括Action、Category和Data的解析规则以及如何通过这些规则匹配隐式Intent。
94 1
|
Android开发
显式Intent和隐式Intent解析
Android中的Intent分为两种类型: * `显式 Intent`:按名称(完全限定类名)指定要启动的组件。 通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,启动新 Activity 以响应用户操作,或者启动服务以在后台下载文件。 * `隐式 Intent` :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。 例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
Activity中getIntent为什么获取不到值?
Activity中getIntent为什么获取不到值?
435 0
|
JSON Java 数据格式
Activity之间使用Intent传递大量数据带来问题
Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之(1024KB),采用的是传递某产品详情,发现当数据大小超过1024的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB以内,但是根据不同版本、不同厂商,这个值会有区别。
425 0
|
XML Java Android开发
Intent的用法(1)
Intent的中文意思是目的,主要是用来在不同的Activity中跳转
Intent的用法(1)
|
XML Java Android开发