一、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;
- 由android:icon 配置图标、android:label 配置标题;
- 如果activity中没有配置icon和label,则会显示application中配置的icon和label;
- 如果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作为标题。