• Intent的属性及Intent-filter配置——Data、Type属性与intent-filter配置


         Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示:

         content://com.android.contacts/contacts/1

         tel:123

         Uri字符串总满足如下格式:

         scheme://host:port/path

         例如上面给出content://com.android.contacts/contacts/1,其中content是scheme部分,com.android.contacts是host部分,port部分被省略了,/contacts/1 是path部分。

         Type属性用于指定该Data所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可。

         Data属性与Type属性的关系比较微妙,这两个属性会相互覆盖,例如:

    • 如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性。
    • 如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性。
    • 如果希望Intent既有Data属性,也有Type属性,应该调用Intent的setDataAndType()方法。  

        下面的示例演示了Intent的Data与Type属性互相覆盖的情形,该示例的界面布局文件很简单,只定义了三个按钮,并为三个按钮绑定了事件监听器。

        下面是该实例的Activity代码。

        

    package com.example.studyintent;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Toast;
    
    public class DataTypeOverride extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_data_type_override);
        }
    
        public void overrideType(View source)
        {
            Intent intent=new Intent();
            //先为Intent设置Type属性
            intent.setType("abc/xyz");
            //再为Intent设置Data属性,覆盖Type属性
            intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
            Toast.makeText(this, intent.toString(),Toast.LENGTH_LONG).show();
        }
        
        public void overrideData(View source)
        {
            Intent intent=new Intent();
            //先为Intent设置Data属性
            intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
            //再为Intent设置Type属性,覆盖Data属性
            intent.setType("abc/xyz");
            Toast.makeText(this, intent.toString(),Toast.LENGTH_LONG).show();
        }
        
        public void dataAndType(View source)
        {
            Intent intent=new Intent();
            //同时设置Intent的Data、Type属性
            intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath"), "abc/xyz");
            Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
        }
        
        
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.data_type_override, menu);
            return true;
        }
    
    }

          上面的三个事件监听方法分别为Intent设置了Data、Type属性,第一个事件监听方法先设置Type属性,再设置Data属性,这将导致Data属性覆盖Type属性,单击按钮激发该事件监听方法,将可以看到如图5.6所示的Toast输出。

          

    从图5.6可以看出,此时的Intent只有Data属性,Type属性被覆盖了。

    上面的示例中第二个事件监听方法先设置了Data属性、再设置了Type属性,这将导致Type属性覆盖Data属性,单击按钮激发该事件监听方法,将可以看到如图5.7所示输出。

     

    上面的示例中第三个事件监听方法同时设置了Data、Type属性、这样该Intent才会同时具有Data、Type属性。

       在AndroidManifest.xml文件中为组件声明Data、Type属性都通过<data.../>元素,<data.../>元素的格式如下:

      

    <data android:mimeType=""
    android:scheme=""
    android:host=""
    android:port=""
    android:path=""
    android:pathPrefix=""
    android:pathPattern=""/>

        上面<data.../>元素支持如下属性。

    • mimeType:用于声明该组件所能匹配的Intent的Type属性。
    • scheme:用于声明该组件所能匹配的Intent的Data属性的scheme部分。
    • host:用于声明该组件所能匹配的Intent的Data属性的host部分。
    • port:用于声明该组件所能匹配的Intent的Data属性的port部分。
    • path:用于声明该组件所能匹配的Intentde Data属性的path部分。
    • pathPrefix:用于声明该组件所能匹配的Intent的Data属性的path前缀。
    • pathPattern:用于声明该组件所能匹配的Intent的的Data属性的path字符串模板。 

        Intent的Type属性也用于指定该Intent的要求,必须对应组件中<intent-filter.../>元素中<data.../>子元素的mineType属性与此相同,才能启动该组件。

        Data属性的“匹配”过程有些差别,它会先检查<intent-filter.../>里的<data.../>子元素然后:

    • 如果目标组件的Data子元素只指定了android:scheme属性,那么只要Intent的Data属性的scheme部分与android:scheme属性值相同,即可启动该组件。
    • 如果目标组件的<data.../>子元素只指定了android:scheme、android:host属性,那么只要Intent的Data属性的scheme、host部分与android:scheme、android:host属性值相同,即可启动该组件。
    • 如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:port属性,那么要求Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:host属性值相同,即可启动该组件。 
    • 如果目标组件的<data.../>子元素只指定了android:scheme、android:host、android:path属性,那么只要求Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:path属性值相同,即可启动该组件。
    • 如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:port、android:path属性,那么就要求Intent的Data属性scheme、host、port、path部分依次与android:scheme、android:host、android:port、android:path属性值相同,才可启动该组价。

         下面的示例测试了Intent的Data属性与<data.../>元素配置的关系,该示例依次配置了如下5个Activity。

     <activity
                android:name="com.example.studyintent.SchemeActivity"
                android:icon="@drawable/ic_scheme"
                android:label="指定scheme的Activity" >
                <intent-filter>
                    <action android:name="xx" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 只要Intent的Data属性的scheme是lee,即可启动该Activity -->
                    <data android:scheme="lee" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.example.studyintent.SchemeHostPortActivity"
                android:icon="@drawable/ic_host"
                android:label="指定scheme、host、port的Activity" >
                <intent-filter>
                    <action android:name="xx" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 只要Intent的Data属性和scheme是lee,且host是www.fkjava.orgport是8888即可启动该Activity -->
                    <data
                        android:host="www.fkjava.org"
                        android:port="8888"
                        android:scheme="lee" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.example.studyintent.SchemeHostPathActivity"
                android:icon="@drawable/ic_sp"
                android:label="指定scheme、host、path的Activity" >
                <intent-filter>
                    <action android:name="xx" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <!--
                          只要Intent的Data属性的scheme是lee,且host是www.fkjava.org path是/maypath,
                            即可启动该Activity
    
    
    
    
                    -->
                    <data
                        android:host="www.fkjava.org"
                        android:path="/mypath"
                        android:scheme="lee" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.example.studyintent.SchemeHostPortPathActivity"
                android:icon="@drawable/ic_path"
                android:label="指定scheme、host、port、path的Activity" >
                <intent-filter>
                    <action android:name="xx" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <!--
                     需要Intent的Data属性的scheme是lee,且host是www.fkjava.org  port是8888,
                     且path是/mypath,才可启动该Activity
    
    
    
    
                    -->
                    <data
                        android:host="www.fkjava.org"
                        android:path="/mypath"
                        android:port="8888"
                        android:scheme="lee" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.example.studyintent.SchemeHostPortPathTypeActivity"
                android:icon="@drawable/ic_type"
                android:label="指定scheme、host、port、path、type的Activity" >
                <intent-filter>
                    <action android:name="xx" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <!--
                     需要Intent的Data属性的scheme是lee,且host是www.fkjava.org port是8888,
                     且path是/mypath 且type是abc/xyz,才可启动该Activity
    
    
    
    
                    -->
                    <data
                        android:host="www.fkjava.org"
                        android:mimeType="abc/xyz"
                        android:path="/mypath"
                        android:port="8888"
                        android:scheme="lee" />
                </intent-filter>
            </activity>

     上面的配置文件中配置了5个Activity,这个5个Activity的实现类都非常简单,它们都仅在界面上显示一个TextView,并不显示其他内容。关于这5个Activity的<data.../>子元素配置的说明如下:

    • 第一个Activity:只要Intent的Data属性的scheme是lee,即可启动该Activity。
    • 第二个Activity:只要Intent的Data属性的scheme是lee,且host是www.fkjava.org、port是8888,即可启动该Activity。
    • 第三个Activiyt:只要Intent的Data属性的scheme是lee,且host是www.fkjava.org、path是/mypath,即可启动该Activiyt。
    • 第四个Activiyt:需要Intent的Data属性的scheme是lee,且host是www.fkjava.org、port是8888、且path是/mypath,才可启动该Activity。
    • 第五个Activity:需要Intent的Data属性的scheme是lee,且host是www.fkjava.org、port是8888、且path是/mypaht,且type是abc/xyz,才可启动该Activity。

         下面是启动第一个Activity的方法:

      public void scheme(View source)
        {
            Intent intent=new Intent();
            //只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.crazyit.org:1234:test"));
            startActivity(intent);
        }

    由于上面的Data属性,只有scheme为lee,也就是只有1个Activity符合条件,因此通过该方法启动Activity时,将可以看到如图5.8所示的Activity。

         下面是第二个启动Activity的方法:

    public void schemeHostPort(View source)
        {
            Intent intent=new Intent();
            //只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
            startActivity(intent);
        }

    由于上面的Intent的Data属性,只有scheme为lee,也就是有第一个Activity符合条件;且该Intent的Data属性的host为www.fkjava.org、port为8888,因此第二个Activity也符合条件。通过该方法启动Activity时将可看到启动5.9所示的选择Activity的界面。

    下面是第3个启动Activity的方法:

    public void schemeHostPath(View source)
        {
            Intent intent=new Intent();
            //只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.fkjava.org:1234/mypath"));
            startActivity(intent);
        }

     由于上面Intent的Data属性,只有scheme为lee,也就是有第一个Activity符合条件;且该Intent的Data属性的host为www.fkjava.org、path为/mypath,因此第三个Activity也符合条件。通过该方法启动Activity时,即可看到启动如图5.10所示的选择Activity的界面。

    下面是第4个启动Activity的方法。

    public void schemeHostPortPath(View source)
        {
            Intent intent=new Intent();
            //只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
            startActivity(intent);
        }

    由于上面Intent的Data属性,只有scheme为lee,也就只有第一个Activity符合条件;且该Intent的Data属性为的host为www.fkjava.org、port为8888,因此第二个Activity也符合条件;且该Intent的Data属性的host为www.fkjava.org、path为/mypath,因此第三个Activity也符合条件;且该Intent的Data属性的host为www.fkjava.org、port为8888、path为/mypath,因此第四个Activity也符合条件。通过该方法启动Activity时,将可看到启动如图5.11所示的选择Activity的界面。

        下面是第5个启动Activity的方法:

    public void schemeHostPortPathType(View source)
        {
            Intent intent=new Intent();
            //同时设置Intent的Data、Type属性
            intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath"), "abc/xyz");
            startActivity(intent);
            
        }

    上面的Intent不仅指定了Data属性,也指定了Type属性,此时符合条件的只有第五个Activity,通过该方法启动Activity时,将可看到启动如图5.12所示的Activity。

  • 相关阅读:
    Webpack配置开发环境总结
    vue2.0 引入font-awesome
    vue-cli 脚手架项目简介(一)
    CSS3伪类与伪元素的区别及注意事项
    页面滚动到可视区域执行操作
    56. 合并区间
    <leetcode c++>卖股票系列
    面试题 16.01. 交换数字
    542. 01 矩阵
    <leetcode c++> 445. 两数相加 II
  • 原文地址:https://www.cnblogs.com/wolipengbo/p/3427574.html
Copyright © 2020-2023  润新知