【Android笔记】隐式Intent中标签详解

说明:上一篇笔记我们有写到调用Intent的setData()方法去启动系统自带的浏览器和拨号面板。
这篇笔记我们主要是详细记录一下关于data标签的知识。
setData()方法接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入Uri.parse()方法中解析产生的。(这句话我也是从书上抄的)

Data标签的属性

除了action和category,我们还可以在intent-filter标签中再配置一个data标签,用于更精确指定当前活动能够响应什么类型的数据。data标签中主要可以配置以下内容。

属性 作用
android:scheme 用于指定数据的协议部分,如http://www.baidu.com中的http部分。
android:host 用于指定数据的主机名部分,如http://www.baidu.com中的www.baidu.com部分。
android:port 用于指定数据的端口部分,一般紧随在主机名之后,如http://www.rowyer:8080/mypath中的8080部分。
android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容,如http://www.rowyer:8080/mypath中的/mypath部分。
android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

注意:只有data标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能响应该Intent。

我们可以通过两个流程图来对照action跟data的匹配规则:
【Android笔记】隐式Intent中标签详解_第1张图片 【Android笔记】隐式Intent中标签详解_第2张图片

也即是说,如果一个activity在inter-filter标签中配置了data标签中的scheme、host、port、path内容,要想启动该活动,setData传入的字符串就必须与data标签中的所有内容一致,否则不能启动。

下面举个栗子:(加上入口Activity总共5个Activity)
(1)在AndroidManifest.xml中配置Activity;(action都是一样的)

<activity android:name=".MainActivity"
            android:label="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>

        
        <activity android:name=".Aty2"
            android:label="Aty2">
            <intent-filter>
                <action android:name="com.example.aboutdata.intent.action"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"/>
            intent-filter>
        activity>

        
        <activity android:name=".Aty3"
            android:label="Aty3">
            <intent-filter>
                <action android:name="com.example.aboutdata.intent.action"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"
                    android:host="www.world.com"/>
            intent-filter>
        activity>

        
        <activity android:name=".Aty4"
            android:label="Aty4">
            <intent-filter>
                <action android:name="com.example.aboutdata.intent.action"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"
                    android:host="www.world.com"
                    android:port="8080"/>
            intent-filter>
        activity>

        
        <activity android:name=".Aty5"
            android:label="Aty5">
            <intent-filter>
                <action android:name="com.example.aboutdata.intent.action"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"
                    android:host="www.world.com"
                    android:port="8080"
                    android:path="/mypath"/>
            intent-filter>
        activity>

(2)在MainActivity中重写onClick()方法,响应按钮事件:

@Override
    public void onClick(View view) {
        Intent intent = new Intent("com.example.aboutdata.intent.action");
        switch (view.getId()){
            case R.id.button:  //按钮1不调用setData()方法
                startActivity(intent);
                break;
            case R.id.button2:
                intent.setData(Uri.parse("http://www.hello.com:1234/yourpath"));
                startActivity(intent);
                break;
            case R.id.button3:
                intent.setData(Uri.parse("http://www.world.com:1234/yourpath"));
                startActivity(intent);
                break;
            case R.id.button4:
                intent.setData(Uri.parse("http://www.world.com:8080/yourpath"));
                startActivity(intent);
                break;
            case R.id.button5:
                intent.setData(Uri.parse("http://www.world.com:8080/mypath"));
                startActivity(intent);
                break;
        }
    }

效果图:
【Android笔记】隐式Intent中标签详解_第3张图片
①按下第一个按钮后:
【Android笔记】隐式Intent中标签详解_第4张图片
系统报错:
【Android笔记】隐式Intent中标签详解_第5张图片
没有找到符合要求的Activity
因为Aty2~Aty5,我们都配置了data标签,而按钮1启动活动没有传入相应的data数据,找不到相应的Activity,所以报错。

②按下第二个按钮后:
【Android笔记】隐式Intent中标签详解_第6张图片
跳转到Aty2

③按下第三个按钮后:
【Android笔记】隐式Intent中标签详解_第7张图片
弹出列表,让用户选择Aty2还是Aty3

④按下第四个按钮后:
【Android笔记】隐式Intent中标签详解_第8张图片
弹出列表,让用户选择Aty2、Aty3还是Aty4

⑤按下第五个按钮后:
【Android笔记】隐式Intent中标签详解_第9张图片
弹出列表,让用户选择Aty2、Aty3、Aty4还是Aty5

所以,要想隐式Intent启动某个配置了data标签的活动,setData()方法传入的字符串数据必须满足data标签里的所有内容,否则不能启动。

你可能感兴趣的:(笔记整理,Android)