Intent的属性Action, Category, Extras,Data

http://blog.163.com/ppy2790@126/blog/static/103242241201381645353273/

Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递。通过其自带的属性,其实可以方便的完成很多较为复杂的操作。例如直接调用拨号功能、直接自动调用合适的程序打开不同类型的文件等等。诸如此类,都可以通过设置Intent属性来完成。
 
Action:代表intent所要完成的一个抽象动作。
   一个Intent只可以设置一个Action。
   Android内部定义了许多动作常量。如:ACTION_CALL,  ACTION_EDIT
   
   用户也可以定义自己的Action strings来激活组件。
   
Category:包含了处理该Intent的组件的种类信息, 起着对action的补充说明作用。
Category属性用于指定当前动作(Action)被执行的环境。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。
Action, Category通常会结合使用。
一个Intent对象可以有任意多个 category
 
Data
   每个Data包含的内容为URL和数据类型(MIME type)。
   URL由四部分组成:scheme, host, port, path
   action的定义往往决定了data该如何定义。 
   例如: 如果 一个Intent的 action 为 ACTION_EDIT 那么它对应的data 应该包含待编辑的数据的URI .
   如果一个action 为:ACTION_CALL ,那么data 应该为 tel: 电话号码的URI . 
   类似的, 如果action 为 ACTION_VIEW 那么data 应该为: http: URI , 接收到的activity 将会下载并显示相应的数据。
 
Extras:Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。
为键-值对形式的附加信息, 通常用于在多个Action之间进行数据交换。 例如ACTION_TIMEZONE_CHANGED的intent有一个"time-zone"附加信息来指明新的时区, 而ACTION_HEADSET_PLUG有一个"state"附加信息来指示耳机是被插入还是被拔出.
 
intent对象有一系列put...()和set...()方法来设定和获取附加信息. 这些方法和Bundle对象很像. 事实上附加信息可以使用putExtras()和getExtras()作为Bundle来读和写.
 
Flags
有各种各样的标志,许多指示Android系统如何去启动一个活动(例如,活动应该属于那个任务)和启动之后如何对待它(例如,它是否属于最近的活动列表)。所有这些标志都定义在Intent类中。
 
Action, Category, Extras, Data四个属性各自的常用值如下所示:
 
  Action:
 
      ACTION_MAIN:Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明。 
 
    ACTION_VIEW:系统根据不同的Data类型,通过已注册的对应Application显示数据。
 
    ACTION_EDIT:系统根据不同的Data类型,通过已注册的对应Application编辑示数据。 
 
    ACTION_DIAL:打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。 
 
    ACTION_CALL:直接呼叫Data中所带的号码。 
 
    ACTION_ANSWER:接听来电。 
 
    ACTION_SEND:由用户指定发送方式进行数据发送操作。
 
    ACTION_SENDTO:系统根据不同的Data类型,通过已注册的对应Application进行数据发送操作。 
 
    ACTION_BOOT_COMPLETED:Android系统在启动完毕后发出带有此Action的广播(Broadcast)。 
 
    ACTION_TIME_CHANGED:Android系统的时间发生改变后发出带有此Action的广播(Broadcast)。 
 
    ACTION_PACKAGE_ADDED:Android系统安装了新的Application之后发出带有此Action的广播(Broadcast)。 
 
    ACTION_PACKAGE_CHANGED:Android系统中已存在的Application发生改变之后(如应用更新操作)发出带有此Action的广播(Broadcast)。 
 
    ACTION_PACKAGE_REMOVED:卸载了Android系统已存在的Application之后发出带有此Action的广播(Broadcast)。  
 
  Category:
 
      CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。 
 
    CATEGORY_HOME:设置该组件为Home Activity。
 
    CATEGORY_PREFERENCE:设置该组件为Preference。 
 
    CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。 
 
    CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。 
 
    CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中。
 
  Extras:
 
      EXTRA_BCC:存放邮件密送人地址的字符串数组。 
 
    EXTRA_CC:存放邮件抄送人地址的字符串数组。
 
    EXTRA_EMAIL:存放邮件地址的字符串数组。 
 
    EXTRA_SUBJECT:存放邮件主题字符串。 
 
    EXTRA_TEXT:存放邮件内容。 
 
    EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。  
 
    EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码。   
 
   Data:
 
       tel://:号码数据格式,后跟电话号码。 
 
    mailto://:邮件数据格式,后跟邮件收件人地址。
 
    smsto://:短息数据格式,后跟短信接收号码。
 
    content://:内容数据格式,后跟需要读取的内容。 
 
    file://:文件数据格式,后跟文件路径。
 
    market://search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
 
    geo://latitude, longitude:经纬数据格式,在地图上显示经纬度所指定的位置。
 
 

如果在AndroidManifest.xml里面指定了<data>这行,那么,需要匹配到它的话,在代码里必须要设置 intent的data,如上面的in.setData(uri)   

Data的语法:

<data android:host="string"

      android:mimeType="string"

      android:path="string"

      android:pathPattern="string"

      android:pathPrefix="string"

      android:port="string"

      android:scheme="string" />

Uri的格式:scheme://host:port/path or pathPrefix or pathPattern

如果scheme没有指定,那其它的属性均无效;

如果host没有指定,那么port,path,pathPrefix,pathPattern均无效;

如果在manifest里这样写:<data android:scheme="something" android:host="project.example.com" />

那么Uri uri = Uri.parse("something://project.example.com"); 才可以匹配

再如:

<data android:scheme="something" android:host="project.example.com" android:port="80"/>

等同于这样写:

<data android:scheme="something"/>

<data android:host="project.example.com"/>

<data android:port="80"/>

那么Uri uri = Uri.parse("something://project.example.com:80"); 才可以匹配

如:

  <activity
            android:name="com.example.activity.AppActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="details"
                    android:path=""
                    android:scheme="market" />
                <data
                    android:host="search"
                    android:path=""
                    android:scheme="market" />
            </intent-filter>
</activity>

  

            Intent in = new Intent();
            in.setAction("android.intent.action.leo");//去掉这行不行,单靠data不能匹配
            in.addCategory(Intent.CATEGORY_DEFAULT);//可以去掉这行,intent的默认category值
            in.setData(uri);//去掉这行不行
            startActivity(in)

  

posted on 2015-03-24 14:49  wjw334  阅读(1027)  评论(0编辑  收藏  举报

导航