Intent与IntentFiler介绍与使用

Intent

  • Intent被称为意图,是程序中各组件进行交互的一种重要方法,他不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
  • 一般用于启动ActivityServer以及发送广播等。根据开启目标组件的方式不同,Intent被分为两种类型显式以图和隐式意图。

显式意图

  • 显式意图可以直接通过名称开启指定的目标组件。
  • 代码演示:
// 创建一个Intent对象,其中第一个参数为Context表示当前的Activity对象,第二个参数表示要启动的目标Activity。
Intent intent = new Intent(this, Activity.class);
// 调用Activity的startActivity方法启动目标组件。
startActivity(intent);

隐式意图

隐式意图通过指定actioncategory等属性,系统根据这些信息进行分析后寻找目标Activity

  • AndroidManifest.xml
<activity android:name=".Main2Activity">
    <intent-filter>
        <!-- 设置action动作,当代码中的action与该action相匹配时启动该组件 -->
        <action android:name="Main2Activity" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • MainActivity.java
Intent intent = new Intent();
// 设置action动作,当与清单文件中的action相匹配时目标组件。
intent.setAction("Main2Activity");
startActivity(intent);

IntentFiler

  • 当发送一个隐式Intent后,Android系统会将他与程序中每一个组件的过滤器进行匹配,匹配属性有actiondatacategory,需要这三个属性都匹配成功才能唤起相应的组件。
  • action :用于指定Intent对象的动作。
<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    ...
</intent-filter>
  • 只要Intent携带的action与其中一个<intent-filter>标签中action的声明相同,action属性就匹配成功。

注意:在清单文件中为Activity添加<intent-filter>标签时,必须添加action属性,否则隐式Intent无法开启Action

  • data:指定数据的URL或者数据MIME类型它的值通常与Intentaction属性有关联。
<intent-filter>
    <data android:mimeType="video/mpeg" />
</intent-filter>
  • 隐式Intent携带的data数据只要与IntentFilter中的任意一个data声明相同,data属性就匹配成功。
  • category:用于为action添加额外信息。
<intent-filter>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
  • 一个IntentFilter可以不声明category属性,也可以声明多个category属性。
  • 隐式Intent中声明的category必须全部能够与某一个IntentFilter中的category匹配才算匹配成功。

注意:IntentFilter中罗列的category属性数量必须大于或者等于隐式Intent携带的category属性数量时,category属性才能匹配成功。如果一个隐式Intent没有设置category属性,那么它可以通过如何一个IntentFilter(过滤器)的category匹配。

ins: rinomaru