转自:http://blog.csdn.net/xywhere/article/details/7218421

Intent 的功能非常强大,最简单的应用是调用另一个Activity以及传递一些附加信息,除此之外还可以调用Android提供的各种组件比如:Service、BroadCast Receiver和Content Provider等。

一、关于Intent的显式调用:

[java] view plain copy print ?
  1. //调用Intent对象的setClassName方法,参数为<包名>,<完整类名>
  2. intent.setClassName("com.smile.intent","com.smile.intent.SecondActivity");
  3. //调用setClass方法参数为,<当前上下文可以用当前Activity.this获得因为Activity类继承了Context类><要调用的类>
  4. intent.setClass(FirstActivity.this,SecondActivity.class);
注意:使用以上的基本方法至少要在Manifest文件中注册Activity名称,否则系统将无法找到它。

[html] view plain copy print ?
  1. <activityandroid:name=".SecondActivity"></activity>

二、关于Intent的隐式调用:

[java] view plain copy print ?
  1. //利用manifest文件中定义好的action名称调用activity,如果有多个activity的action相同则系统弹出菜单让用户选择
  2. //通常action名字为<包名><intent.action><类名>,也可以自定义
  3. StringactionName="<包名>.intent.action.secondAction";
  4. Intentintent=newIntent(actionName);
注意:使用以上的基本方法要在Manifest文件中注册Activity名称以及action属性,否则系统将无法找到它。
[html] view plain copy print ?
  1. <activity
  2. android:name=".ThirdActivity"
  3. android:label="@string/third">
  4. <intent-filter>
  5. <actionandroid:name="com.smile.intent.intent.action.secondAction"/>
  6. <!--category.DEFAULT这个必须有种类一般为默认随后会介绍其他的,否则找不到,只有一个这个活动的activity会报错,如果多个则是没有category
  7. 属性的被忽略不可见-->
  8. <categoryandroid:name="android.intent.category.DEFAULT"/>
  9. </intent-filter>
  10. </activity>

Intent-filter中的data应用,下面是调用android系统浏览器的一个例子,通过调用intent的setData方法得到一个URI,startActivity方法首先找到所有匹配的action,接着看其中哪个activity能处理这种类型的URI,如何判断URI类型则需要匹配schema,schema就是URI的前缀,比如http,为字符串类型。当然它也需要在manifest文件中定义,例如:<data android:scheme="http"/> 则系统就认为这个activity可以处理http为前缀的URI,从而完成匹配。

[java] view plain copy print ?
  1. //调用android默认提供的action
  2. Intentintent=newIntent(Intent.ACTION_VIEW);
  3. intent.setData(Uri.parse("http://www.baidu.com"));
  4. startActivity(intent);

还有一种方法是通过mimeType来匹配Activity,这种匹配也属于data属性例如在manifest中定义<data android:mimeType="vnd.android.cursor.dir/vnd.smile.second"/>则调用代码如下。注意data属性中如果定义了多种比如schem和mimeType都定义了相关类型,则必须三项都匹配才调用,缺一不可。mimeType中前面是父类型,vnd代表类型是专有的而不是公认的标准,android是公司名,cursor代表返回的是cursor,dir代表集合,item代表单个,后面是子类型同上。

[java] view plain copy print ?
  1. Intentintent=newIntent(actionName);
  2. //设置所需调用activity的mimeType类型
  3. intent.setType("vnd.android.cursor.dir/vnd.smile.second");
  4. startActivity(intent);

intent在调用其他组件的同时也可以将一些必要信息传递过去,调用intent的setExtras方法,参数可以是一个string类型的key,和一个object类型的value,另一种方法是直接传递一个Bundle,Bundle就是把数据打个包运过去,其实功能和上面方法没什么太大区别。两种方式不能同时使用,否则最后面的将覆盖前面的。

[java] view plain copy print ?
  1. //利用Bundle传递数据
  2. Intentintent=newIntent(actionName);
  3. intent.setTyp("vnd.android.cursor.dir/vnd.smile.second");
  4. Bundleb=newBundle();
  5. b.putString("name","smilebundle");
  6. intent.putExtras(b);
  7. startActivity(intent);
  8. //Bundle取得数据
  9. Intentintent=this.getIntent();
  10. Bundleb=intent.getExtras();
  11. System.out.println(b.getString("name"));

[java] view plain copy print ?
  1. //利用普通方法传递数据
  2. Intentintent=newIntent(actionName);
  3. intent.setType("vnd.android.cursor.dir/vnd.smile.second");
  4. intent.putExtra("name","smile");
  5. startActivity(intent);
  6. //取出数据
  7. Intentintent=this.getIntent();
  8. Stringstr=intent.getStringExtra("name");

Intent 中的category属性

activity也分成一些类别,application中第一个启动的activity有一个属性为:<category android:name="android.intent.category.LAUNCHER" />表示是默认启动的activity。

还有一些常用的如category.HOME 表示是屏幕首页category.DEFAULT表示默认类别,一般这个activity无其他特殊作用时候,如果用action调用一个activity,则必须有类别属性即category属性,除了<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT"/>这个特殊情况,其他的如果想要为某个activity设置一个category属性,则在其他属性的基础上必须也得有<category android:name="android.intent.category.DEFAULT" />否则系统找不到。

[java] view plain copy print ?
  1. //下面给intent增加了一个category属性,系统会去查找符合这个属性的activity
  2. Intentintent=newIntent(actionName);
  3. intent.addCategory(Intent.CATEGORY_EMBED);
  4. startActivity(intent);

配置文件需要注册,上面actionName是一个变量内容应该为下面的活动名称

[html] view plain copy print ?
  1. <categoryandroid:name="android.intent.category.DEFAULT"/>
  2. <categoryandroid:name="android.intent.category.EMBED"/>
  3. <actionandroid:name="com.smile.intent.intent.action.secondAction"/>

匹配规则:

Action:首先匹配action,有一个action请求,则intent filter中的cation的至少有一个所请求的action才会被响应,一个intent filter可以有多个action,只要匹配一个就可以被调用。


Data:如果intent filter中没有data属性,则任何带有data属性的intent都不会被匹配。它只会匹配没有任何data 属性的intent。如果intent filter中没有定义data属性,则请求中只要有data属性就会报错。
Data-mimeType:一个Intent filter可以有多个data type,每次匹配只能匹配一种。有两种方式。1、如果是一个内容或者文件URI,当执行setData后,系统将会自动计算出它的类型。2、是直接调用setType方法指定类型。安卓还允许使用 父类型/* 的方法指定所有子类型比如: image/* 则指定了所有图片类型。
Data-Scheme:一个请求intent中如果包含scheme,则必须是intent filter中定义好的。scheme是data URI的第一部分,比如http://www.baidu.com 中http就为scheme,
Data-Authority:URI的地址部分,如www.baidu.com,但是如果匹配这个必须先匹配schema。
Data-Path 一个URI的最后部分,必须与前两个共同使用


Intent-Category每一个请求intent所包含的category必须在intent filter中能找到,可以有多个category。注意:通过隐式调用startActivity()方法,默认只会寻找所有含有android.intent.category.DEFAULT的activity。所以任何activity如果想通过隐式被调用则在intent filter中必须包含default category。有一个特例如果你的activity默认启动的则不需要default category,但是加上不影响什么。

更多相关文章

  1. Android(安卓)init进程一些容易忽视的技术细节
  2. Android(安卓)增加预置的APN信息
  3. JNI中调用JAVA各种方法详解
  4. Android(安卓)开发学习小结(五)
  5. android:persistent属性
  6. Android:RelativeLayout 内容居中
  7. Android(安卓)动画效果(一)
  8. Android(安卓)httpGet 使用 以及使用Handler异步更新textview的t
  9. Android(安卓)WebView 全面干货指南

随机推荐

  1. Android的ps命令介绍和技巧
  2. Android(安卓)面试题(2)
  3. android:layout_gravity 和 android:grav
  4. [时间线]Android市场的发展
  5. 【Android】MVC模式在Android系统中的应
  6. Android开发-一个简单的五子棋游戏
  7. 1.1 Android历史与版本进化
  8. Android(安卓)的Margin和Padding属性以及
  9. Android的UI构造试图工具hierarchyviewer
  10. Android(安卓)Switch属性全记录