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作为标题。

相关推荐
黑码哥13 分钟前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓24 分钟前
[JDBC]元数据
android
独行soc35 分钟前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能43 分钟前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿44 分钟前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc1 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20352 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106322 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
vistaup2 小时前
OKHTTP 默认构建包含 android 4.4 的TLS 1.2 以及设备时间不对兼容
android·okhttp
常利兵2 小时前
ButterKnife在Android 35 + Gradle 8.+环境下的适配困境与现代化迁移指南
android