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

相关推荐
solo_993 小时前
用 LSPosed 模拟录屏音频编码器卡顿:从思路到落地
android
zzq77973 小时前
别把大模型 API Key 写进 APK:移动 AI 应用接口防盗刷实践
android·人工智能·安全·app加固·御盾安全·安卓加固
xiaopang5 小时前
RK3568 AOSP 编译与快速部署实战
android
码农coding6 小时前
android12 SystemUI之通知
android
summerkissyou19876 小时前
android - 性能 - Perfetto - cpu 分析教程及例子
android·性能
AFinalStone8 小时前
Android 7系统休眠唤醒(七)内核层—wakelock与autosleep机制
android·休眠唤醒
starvapour8 小时前
在关机键损坏的情况下让手机关机
android·adb·手机
AFinalStone8 小时前
Android 7系统休眠唤醒(八)内核层—Alarm定时唤醒与硬件唤醒源
android·电源管理·休眠唤醒
AFinalStone9 小时前
Android 7系统休眠唤醒(五)休眠全链路
android·电源管理·休眠唤醒