现在的位置: 首页 > 综合 > 正文

Intent 属性的作用

2017年10月23日 ⁄ 综合 ⁄ 共 13062字 ⁄ 字号 评论关闭
Public Constructors
Intent()
Create an empty intent.
Intent(Intent o)
Copy constructor.
Intent(String action)
Create an intent with a given action.
Intent(String
action, Uri uri)
Create an intent with a given action and for a given data url.
Intent(Context
packageContext, Class<?> cls)
Create an intent for a specific component.
Intent(String
action, Uri uri,
Context
packageContext,
Class
<?> cls)
Create an intent for a specific component with a specified action and data.

Component属性(显式Intent):

 Intent的Component属性需要接收一个ComponentName对象,ComponentName对象包含如下构造器(指定包名和类名)可唯一确定一个组件类,指定了该属性的Intent称为显式Intent,没有指定Component属性的Intent称为隐式Intent,应用会根据Intent指定的规则去启动符合条件的组件:

 ComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件

 ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件

 ComponentName(Context pkg,Class<?> cls):创建pkg所对应的包下的cls类所对应的组件。

初次之外Intent还包含如下三个方法:

 setClass(Context packageContext,Class<?> cls):设置Intent将要启动的组件对应的类

 setClassName(Context packageContext,String className):设置Intent将要启动的组件对应的类名

 setClassName(String packageName,String className):设置该Intent将要启动的组件对应的类名

核心代码:

FirstActivity:

 ComponentName comp = new ComponentName(ComponentAttr.this,SecondActivity.class);

 Intent intent = new Intent();

 intent.setComponent(comp);

 startActivity(intent);

SecondActivity:

 ComponentName comp = getIntent().getComponent();

 show.setText(“组件包名为:“+comp.getPackageName() +"组件类名为:"+comp.getClassName());

Action,Category属性与intent-filter配置(隐式Intent):

Intent的Action,Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象”动作“,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合使用。

到底程序会启动哪个Activity?取决于Activity配置中的<intent-filter.../>元素的配置。<intent-filter.../>元素是<activity.../>元素的子元素,该元素用于配置Activity所能响应的Intent。

<intent-filter.../>元素通常可包含如下子元素:

 0~N个<action.../>子元素

 0~N个<category.../>子元素

 0~1个<data.../>子元素

该元素也是<service.../>,<receiver.../>元素的子元素,用于表明它们可以相应的Intent。

核心代码:

FirstActivity:

 Intent intent = new Intent();

 intent.setAction("com.coslay.intent.action.SomeThing");

SecondActivity:

// 获取该Activity对应的Intent的Action属性
        String action = getIntent().getAction();

AndroidManifest.xml:

<activity android:name=".SecondActivity"
                android:label="@string/app_name">
            <intent-filter>
                <!-- 指定该Activity能响应Action为指定字符串的Intent -->
                <action android:name="com.coslay.intent.action.SomeThing" />
                <!-- 指定该Activity能响应Action属性为helloWorld的Intent -->
                <action android:name="com.coslay.intent.category.SomeThing" />
                <!-- 指定该Action能响应Category属性为指定字符串的Intent -->
                <category android:name="android.intent.category.DEFAULT" />   
            </intent-filter>

代码说明:

一个Intent对象最多只能包括一个Action属性,但一个Intent对象可以包含多个Category属性( 通过intent.addCategory(String);增加)。当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。


指定Action、Category调用系统Activity:

主要代码:

Activity:

@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bn = (Button) findViewById(R.id.bn);
        // 为bn按钮绑定事件监听器
        bn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                // 创建Intent
                Intent intent = new Intent();
                //设置Intent的Action属性
                intent.setAction(Intent.ACTION_GET_CONTENT);
                //设置Intent的Type属性
                intent.setType("vnd.android.cursor.item/phone");
                // 启动Activity,并希望获取该Activity的结果
                startActivityForResult(intent, PICK_CONTACT);
            }
        });
    }

@Override
    public void onActivityResult(int requestCode
        , int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode)
        {
            case (PICK_CONTACT):
                if (resultCode == Activity.RESULT_OK)
                {
                         ...
                }
                break;
        }
    }

另一个例子:

Activity:

@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bn = (Button) findViewById(R.id.bn);
        bn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 创建Intent对象
                Intent intent = new Intent();
                // 为Intent设置Action、Category属性
                intent.setAction(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                startActivity(intent);
            }
        });
    }

Data、Type属性与intent-filter配置

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

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

格式:scheme://host:port/path

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

Data属性与Type属性设置如下:

如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性

如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性

如果希望Intent既有Data属性,也有Type属性,应该调用Intent的setDataAndType()方法

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

<data android:mineType=""   用于声明该组件所匹配的Intent的Type属性

  android:scheme=""              用于声明该组件所能匹配的Intent的Data属性的scheme部分

  android:host=""                                                                                          ...host部分

  android:port=""                                                                                           ...port部分

  android:path=""                                                                                          ...path部分

  android:pathPrefix=""                                                                                 ...path前缀

  android:pathPattern="" />                                                                            ...path字符串模板

Intent的Type属性必须对应组件中<intent-filter.../>元素中<data.../>子元素的mimeType属性与此相同,才能启动该组件。

Intent的Data属性并不需要启动组件的<intent-filter.../>中额<data.../>的4个属性值完全相同。匹配规则如下:

  如果目标组件的<data.../>子元素只指定了android:scheme属性,那么只要Intent的Data属性的scehme部分部分...与android:scehme属性值相同,即可启动该组件

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

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

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

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

注意:

  配置Activity的<intent-filter.../>元素时,<action.../>子元素的name属性是随意指定的,这是必需的。如果希望<data.../>子元素能正常起作用,至少要配置一个<action.../>子元素,但该元素的android:name属性值可以是任意的字符串

核心代码:

AndroidManifest.xml:

       <activity
            android:name=".DataTypeAttr"
            android:label="@string/title_activity_data_type_attr">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_scheme"
            android:name=".SchemeActivity"
            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:icon="@drawable/ic_host"
            android:name=".SchemeHostPortActivity"
            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.org
                、port是8888即可启动该Activity -->
                <data
                    android:scheme="lee"
                    android:host="www.fkjava.org"
                    android:port="8888" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_sp"
            android:name=".SchemeHostPathActivity"
            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是/mypath即可启动该Activity -->
                <data
                    android:scheme="lee"
                    android:host="www.fkjava.org"
                    android:path="/mypath" />
            </intent-filter>
        </activity>    
        <activity
            android:icon="@drawable/ic_path"
            android:name=".SchemeHostPortPathActivity"
            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:scheme="lee"
                    android:host="www.fkjava.org"
                    android:port="8888"
                    android:path="/mypath"/>
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_type"
            android:name=".SchemeHostPortPathTypeActivity"
            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:scheme="lee"
                    android:host="www.fkjava.org"
                    android:port="8888"
                    android:path="/mypath"
                    android:mimeType="abc/xyz"/>
            </intent-filter>
        </activity>

Activity:

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void scheme(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.crazyit.org:1234/test"));
        startActivity(intent);
    }
    public void schemeHostPort(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
        startActivity(intent);    
    }
    public void schemeHostPath(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:1234/mypath"));
        startActivity(intent);    
    }
    public void schemeHostPortPath(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
        startActivity(intent);
    }
    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);
    }


使用Action、Data属性启动系统Activity:

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bn = (Button) findViewById(R.id.bn);
        // 为bn按钮添加一个监听器
        bn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 创建Intent
                Intent intent = new Intent();
                String data = "http://www.crazyit.org";
                // 根据指定字符串解析出Uri对象
                Uri uri = Uri.parse(data);
                // 为Intent设置Action属性
                intent.setAction(Intent.ACTION_VIEW);
                // 设置Data属性
                intent.setData(uri);
                startActivity(intent);
            }
        });

        Button edit = (Button) findViewById(R.id.edit);
        // 为edit按钮添加一个监听器
        edit.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 创建Intent
                Intent intent = new Intent();
                // 为Intent设置Action属性(动作为:编辑)
                intent.setAction(Intent.ACTION_EDIT);
                String data = "content://com.android.contacts/contacts/1";
                // 根据指定字符串解析出Uri对象
                Uri uri = Uri.parse(data);
                // 设置Data属性
                intent.setData(uri);
                startActivity(intent);
            }
        });
        Button call = (Button) findViewById(R.id.call);
        // 为edit按钮添加一个监听器
        call.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 创建Intent
                Intent intent = new Intent();
                // 为Intent设置Action属性(动作为:拨号)
                intent.setAction(Intent.ACTION_DIAL);
                String data = "tel:13800138000";
                // 根据指定字符串解析出Uri对象
                Uri uri = Uri.parse(data);
                // 设置Data属性
                intent.setData(uri);
                startActivity(intent);
            }
        });
    }

Extra属性:

Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,它可以存入多组key-value对,这样可以通过Intent在不同Activity之间进行数据交换了。

Flag属性:

Intent的Flag属性用于为该Intent增加一些额外的控制旗标,Intent可调用addFlags()方法来为Intent增加控制旗标。

参考:http://developer.android.com/reference/android/content/Intent.html

         http://blog.csdn.net/coslay/article/details/20698421

Intent过滤器过滤流程图:

抱歉!评论已关闭.