Intent和Intent Filters

什么是Intent

    Intent是android开发中的重要对象,它作为一个信息承载对象存在。
    我们可以在使用其他一些组件的时候从Intent获取行为响应的准则(即应该做什么东西,如何做)
 
Intent的三种基本使用场景
启动一个Activity:
    通过传递一个Intent对象给startActivity(Intent intent)方法,可以启动一个Activity
 
启动一个服务:
    像启动Activity一样,我们也可以传递一个Intent对象给startService(Intent intent),从而启动一个服务。
 
发送一个广播:
    我们先不管广播是什么东西,现在我们只需要知道向sendBroadcast(Intent intent)方法传递一个Intent对象,就可以发送广播。
    当然,这不是创建广播的全部内容。
 
Intent的类型
intent类型有两种
    显式Intent:需要使用组件的类的全名创建。
               因为我们知道自己创建的类名称,所以一般这个方法在自己的程序内部使用。
显式Intent的创建方法: 
 
//this为应用程序的上下文,MyActivity是自定义类
Intent intent = new Intent(this, MyActivity.class)
 
    隐式Intent:可以在androidManifest注册组件的时候使用intentfilter标签创建。
               只要系统匹配到这个intentfilter,该组件就会被运行。
 
创建隐式Intent的例子(以启动Activity为例):
AndroidManifest文件中有如下Activity的定义
默认情况下,你的隐式intent必须包含 CATEGORY_DEFAULT category
如果没有,系统就找不到你的Activity
建议使用你的应用程序的包名+action名称作为action的字符串
<activity
android:name="com.example.intentdemo.IntentActivity"
android:label="@string/title_activity_intent" >
<intent-filter>
     <action android:name="com.example.MYACTION" />
     <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
 

 

在程序中我们可以使用下面的代码启动这个Activity
Intent intent = new Intent("com.example.MYACTION");
startActivity(intent);

 

 
需要注意的是,当我们需要使用Intent启动一个服务的时候,最好使用显式Intent
因为我们并不知道系统中有多少个使用相同名称定义的服务组件,当启动服务的时候,
我们也不知道到底启动了哪个服务,也无法看到是哪个服务。
从android5.0开始,当我们使用隐式intent传递给bindService()函数的时候,
系统就会抛出异常。
 
Intent里面所包含的信息
既然intent是用来承载信息的,那么它到底可以装载什么信息呢?
1.组件名称:
如,Activity名称,Service名称等。当我们使用显式intent的时候,
我们就要使用这些组件的名称来构造Intent
2.Action(包含在AndroidManifest文件中)
    指定Intent执行什么动作的字符串
    系统已经为我们预先定义了一系列的字符串,我们拿来即可以用。
    具体可以看Intent的官方文档。
    我们也可以定义自己的字符串,只要在<intent-filter>标签里的<action />标签里定义即可
3.Data(包含在AndroidManifest文件中,具体可定义下面的内容)
<data android:scheme="string"
      android:host="string"
      android:port="string"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      android:mimeType="string" />

 

包括指向你要操作的数据的Uri或者你的组件可处理(接受)的数据的类型
例如你的action指定为ACTION_EDIT,那么你的Data包含的Uri就是你要编辑的文件的Uri(可以理解为文档路径)
 
android:scheme属性:用于指定Uri的类型,如网络类型的http,ContentProvider类型的content
android:scheme="http"
android:scheme="content"
如果scheme没有被设置,那么所有的Uri属性将被忽略
如果host没有被设置,那么所有的port属性和path属性将被忽略
如果你的<intent-filter>设置了数据类型(mimeType),但是没有设置scheme
那么系统假设你的Uri类型是content或者file
 
setDate()方法和setType()方法
    这两个方法用于设置组件的Uri和数据类型(对应AndroidManifest文件中的schema和mimeType)
    但是,当我们需要同时设置Uri和mimeType的时候,我们不能同时使用这两个方法,而是应该使用setDataAndType()方法。
 
4.Category
    我们可以使用系统预定义的分类,也可以定义自己的分类。
    还记得我们使用隐式intent的时候需要设置CATEGORY_DEFAULT分类吗。
 
5.Extras
    顾名思义,即额外的东西,以键值对的方式保存。
    你可以使用Intent来传递你可以想象得到的数据类型,如,int,String,Array等
posted @ 2014-12-29 14:11  破代码  阅读(446)  评论(0编辑  收藏  举报