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

相关推荐
烬奇小云2 小时前
认识一下Unicorn
android·python·安全·系统安全
顾北川_野14 小时前
Android 进入浏览器下载应用,下载的是bin文件无法安装,应为apk文件
android
CYRUS STUDIO14 小时前
Android 下内联汇编,Android Studio 汇编开发
android·汇编·arm开发·android studio·arm
右手吉他15 小时前
Android ANR分析总结
android
PenguinLetsGo16 小时前
关于 Android15 GKI2407R40 导致梆梆加固软件崩溃
android·linux
杨武博19 小时前
音频格式转换
android·音视频
音视频牛哥21 小时前
Android音视频直播低延迟探究之:WLAN低延迟模式
android·音视频·实时音视频·大牛直播sdk·rtsp播放器·rtmp播放器·android rtmp
ChangYan.21 小时前
CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法
android·conda
二流小码农21 小时前
鸿蒙开发:ForEach中为什么键值生成函数很重要
android·ios·harmonyos
夏非夏1 天前
Android 生成并加载PDF文件
android