action、category与Data

一、action

使用intent隐式启动activity时,必须给intent指定一个action。而目标activity可以在<intent-filter>中定义一个或多个action。例如:

XML 复制代码
    <intent-filter>
        <action android:name="com.test.action.ACT2" />
        <action android:name="com.test.action.ACT3" />
        <action android:name="com.test.action.ACT4" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.test.CATEGORY_ACT2" />
    </intent-filter>

二、category

使用intent隐式启动activity时,可以指定0个或多个category。而目标activity的清单文件可以在<intent-filter>中定义多个category。由于Intent默认会携带一个**"android.intent.category.DEFAULT"** ,所以目标activity清单文件中一般需要至少定义一个 <category android:name="android.intent.category.DEFAULT" />,有个例外,就是主启动activity中不用定义这个默认的category配置,如:

XML 复制代码
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

三、action和category匹配规则

1、一个intent携带一个action,所以只要目标activity清单文件配置中有一个匹配的action,就算匹配成功;

2、一个intent可以携带多个category(至少有一个,因为默认会携带android.intent.category.DEFAULT),所以只有目标activity清单文件的<intent-filter>中包含了intent携带的所有category才能匹配成功。

注意:由于默认会携带android.intent.category.DEFAULT,所以定义的Activity清单文件配置必须包含android.intent.category.DEFAULT,才能通过Intent隐式启动。

四、data

我们还可以在 <intent-filter>标签中再配置一个data标签,用于更精确地指定当前Activity能够响应什么类型的数据。data标签可以配置以下内容:

android:scheme:用于指定数据的协议部分,如 http 。

android:host:用于指定数据的主机名部分。

android:port:用于指定数据的端口部分。

android:path:用于指定主机名和端口之后的路径部分。

android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

指定数据的匹配方式就很简单了,Intent中数据的格式必须与data标签中定义的格式一致,才能匹配成功。

五、android.intent.action.MAIN与android.intent.category.LAUNCHER

这两个配置都是在 AndroidManifest.xml 清单文件activity的<intent-filter>标签下面进行配置的。其中,

android.intent.action.MAIN表示应用入口,即点击应用图标时,最先启动的activity;

android.intent.category.LAUNCHER表示是否在程序列表(桌面)里显示当前activity;

  1. android:icon 配置图标、android:label 配置标题;
  2. 如果activity中没有配置icon和label,则会显示application中配置的icon和label;
  3. 如果application中也没有配置icon和label,则显示系统默认的应用图标,显示应用id作为标题**);**

场景一:只配置 android.intent.action.MAIN 或 android.intent.category.LAUNCHER中的一个,都不会在程序列表显示应用图标;如:

XML 复制代码
    <activity
        android:name=".TestActivity1"
        android:exported="true"
        android:icon="@drawable/baidu1"
        android:label="测试动画界面1"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".TestActivity2"
        android:exported="true"
        android:icon="@drawable/baidu2"
        android:label="测试界面2"
        >
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

场景二:一个activity中配置 android.intent.action.MAIN 和 android.intent.category.LAUNCHER,则程序列表会显示当前activity的icon和label;

场景三:多个activity中配置 android.intent.action.MAIN 和 android.intent.category.LAUNCHER,则程序列表会显示多个activity配置的icon和label。如下,会在桌面上显示两个图标和标题,且点击某个图标就会进入对应的那个activity中:

XML 复制代码
    <activity
        android:name=".TestActivity1"
        android:exported="true"
        android:icon="@drawable/baidu1"
        android:label="测试动画界面1"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER"
        </intent-filter>
    </activity>
    <activity
        android:name=".TestActivity2"
        android:exported="true"
        android:icon="@drawable/baidu2"
        android:label="测试界面2"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

总结:android.intent.action.MAIN 和 android.intent.category.LAUNCHER需要一起配置才能正常显示出应用的图标和标题。

注意:系统设置中的应用列表需要读取application中配置的icon和label,如果application中没有配置,则显示系统默认的应用图标作为当前应用的图标,显示应用id作为标题。

相关推荐
gfdgd xi28 分钟前
GXDE 内核管理器 1.0.1——修复bug、支持loong64
android·linux·运维·python·ubuntu·bug
美狐美颜sdk29 分钟前
跨平台直播美颜sdk集成攻略:Android、iOS与Web的统一方案
android·前端·ios
❀͜͡傀儡师2 小时前
二维码/条码识别、身份证识别、银行卡识别、车牌识别、图片文字识别、黄图识别、驾驶证(驾照)识别
android·scanner
生莫甲鲁浪戴3 小时前
Android Studio新手开发第三十五天
android·ide·android studio
qq_717410013 小时前
FAQ20472:相机录像镜像功能实现
android
非专业程序员Ping4 小时前
HarfBuzz 实战:五大核心API 实例详解【附iOS/Swift实战示例】
android·ios·swift
流星魂小七5 小时前
颜色选择器
android·着色器·环形颜色选择器·圆形颜色选择器·colorpicker·colorwheelview
cdming5 小时前
LIUNX 与手机安卓的文件互传 的常用方法
android·智能手机
雨白7 小时前
Flow 的异常处理与执行控制
android·kotlin
00后程序员张8 小时前
Web 前端工具全流程指南 从开发到调试的完整生态体系
android·前端·ios·小程序·uni-app·iphone·webview