Intent

Intent的作用

  1. 用于启动一个Activity,Service,BroadcastReceiver组件
  2. 用于被启动组件之间的信息交换(例如两个Activity可以把交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象.)

Intent的属性

Component属性

Intent的Component的属性接受一个ComponentName对象.
ComponentName需要指定包名和类名.

//ManinActivity.java中为按键绑定的监听器
ComponentName comp = new ComponentName(ManinActivity,this, SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
startActivity(intent);

指定Component属性的Intent明确它要启动哪个组件,因此这种Intent被称为显式Intent;
没有指定Component属性的Intent被称为隐式Intent.

Action属性和Category属性

  1. Action属性代表代表该Intent所要完成的一个抽象动作;
    Category属性代表为Action增加额外的附加类别消息,Action属性和Category属性经常结合使用.
  2. 由于是隐式Intent,从代码中无法看出下面程序要去启动哪个Activity.因此,需要启动哪个Activity取决于Activity配置中<intent-filter>.
//ManinActivity.java中为按键绑定的监听器
Intent intent = new Intent();
intent.setAction(MainActivity.CRAZYIT_ACTION);
intent.addCategory(MainActivity.CRAZYIT_CATEGORY);
startActivity(intent)

因此被启动的目标Activity中的配置文件中应该有如下信息:

//AndroidManifest.xml配置文件中SecondActivity的配置信息
//上面代码的MainActivity的路径是在\org\crazyit\intent\MainActivity.java
<activity android:name=".SecondActivity"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="org.crazyit.intent.action.CRAZYIT_ACTION" />
        <category android:name="org.crazyit.intent.category.CRAZYIT_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
    < /intent-filter>
< /activity>

==说明==

  • <inter-filter .../>元素是AndroidManifest.xml文件中<activity .../>元素的子元素,<activity .../>为应用程序配置Activity,<inter-filter .../>配置该Activity所能相应的Intent.
  • <intent-filter .../>元素中可以包含以下子元素:

    • 0-N个<action .../>子元素
    • 0-N个<category .../>子元素
    • 0-1个<data .../>子元素
  • <intent-filter .../>也可以时<service .../>和<receiver .../>的子元素
  • 一个Intent对象最多只能包括一个Action属性,通过setAction(String str)方法来设置属性;一个Intent对象可以包括多个Category属性,通过调用addCategory(String str)方法来添加属性.
  • 因为程序创建一个Intent时,该Intent会默认启动Category的属性值Intent.CATEGORY_DEFAULT(常量值为android.intent.category.DEFAULT)常量的组件,所以在被启动的Activity中的配置文件中需要添加:
<category android:name="android.intent.category.DEFAULT" />
  • 注意:在AndroidManifest.xm文件中的<intent-filter .../>下可以有多个<action .../>,但是在XXXActivity.java中只能设置一个Action属性,可以有多个Category属性.
  • Intent对象不仅可以启动应用程序自身内的组件,还可以启动其他应用程序的组件和系统自带的程序的组件.

Data属性和Type属性

  1. Data属性用于向Action属性提供操作的数据,接受一个Uri对象.

    • Uri对象通常是如下形式的字符串:
      schem://host:port/path

      例如:content://www.baidu.com:88/test,content是schem部分;www.baidu.com是host部分;88是port部分;test是path部分.

  2. Type属性用于指定该Data属性指定Uri对应的MIME类型,只要符合abc/xyz格式的字符串即可.
  3. Data属性与Type属性的关系:

    • 如果Intent先设置Data属性,后设置Type属性,那么Type属性会覆盖Data属性
    • 如果Intent先设置Type属性,后设置Data属性,那么Data属性会覆盖Type属性
    • 如果希望Intent既有Data属性又有Type属性,可以调用setDataAndType()方法.
  4. 在AndroidManifest.xml文件中为组件声明Data,Type属性通过<data .../>元素,格式如下:

    • mimeType:该组件所匹配的Intent的Type属性;
    • scheme:该组件所匹配的Intent的Data属性的scheme部分;
    • host:该组件所匹配的Intent的Data属性的host部分;
    • port:该组件所匹配的Intent的Data属性的port部分;
    • path:该组件所匹配的Intent的Data属性的path部分;
    • pathPrefix:该组件所匹配的Intent的Data属性的path前缀;
    • pathPattern:该组件所匹配的Intent的Data属性的path字符串模板
    <data android:mimeType=""
    android:scheme=""
    android:host=""
    android:port=""
    android:path=""
    android:pathPrefix=""
    android:pathPattern=""
    />
  • ==说明==:

    • 至于Type属性: XXXActivity中Intent通过setType()设置的Type属性 和 AndroidManifest.xm中被启动Activity的<intent-filter .../>元素的<data .../>子元素的mimeType属性完全相同.
    • 至于Data属性: 由于Uri对象可以分为schem,host,port,path部分, 因此不需要与被启动组件的<intent-filter .../>中<data .../>子元素的android:schem,android:host,android:port,android:path完全满足.

      • 如果被启动组件B的<data .../>中只指定了android:scheme属性,那么只要组件A中Intent的Data属性的scheme部分与其相同,就可以启动组件B.
      • 同理,也可以只指定android:scheme和android:host;
      • 也可以只指定android:scheme,android:host和android:port;
      • 也可以只指定android:scheme,android:host和android:path;
      • 也可以指定android:scheme,android:host,android:port和android:path;
      • 但是不能只有android:port没有android:host;也不能只有android:path没有android:host
      • 如果希望<data .../>下的子元素能正常起作用.必须配置一个<action .../>子元素,不过<action .../>的android:name可以时任意的字符串.
//MainActivity.java
Intent intent = new Intent();
String data = "http://wwww.crazyit.org";
Uri uri = Uri.parse(data);

// intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);

//对应的被启动Activity的AndroidManifest.xml文件
<activity
    android:icon="drawable/ic_type"
    android:name="SecondActivity"
    <intent-filter>
        <action android:name="xxx"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data
            android:scheme="http"
            /*可以省略*/
            android:host="www.crazyit.org"
        />
    </intent-filter>
/activity>

Extra属性

该属性用于多个Action之间的数据交流,其属性值应该是一个Bundle对象,可以通过Intent在不同Activity之间进行数据交换,


Flag属性

该属性用于为对应的Intent添加一些额外的控制标识,可以调用intent 的addFlags()方法添加控制标识.


wydong
40 声望5 粉丝

wyd