转自:http://blog.csdn.net/xywhere/article/details/7218421
Intent 的功能非常强大,最简单的应用是调用另一个Activity以及传递一些附加信息,除此之外还可以调用Android提供的各种组件比如:Service、BroadCast Receiver和Content Provider等。
一、关于Intent的显式调用:
-
- intent.setClassName("com.smile.intent", "com.smile.intent.SecondActivity");
-
-
- intent.setClass(FirstActivity.this, SecondActivity.class);
注意:使用以上的基本方法至少要在Manifest文件中注册Activity名称,否则系统将无法找到它。
- <activity android:name=".SecondActivity"></activity>
二、关于Intent的隐式调用:
-
-
- String actionName = "<包名>.intent.action.secondAction";
- Intent intent = new Intent(actionName);
注意:使用以上的基本方法要在Manifest文件中注册Activity名称以及action属性,否则系统将无法找到它。
- <activity
- android:name=".ThirdActivity"
- android:label="@string/third">
- <intent-filter>
- <action android:name="com.smile.intent.intent.action.secondAction"/>
- <!-- category.DEFAULT 这个必须有种类一般为默认随后会介绍其他的,否则找不到,只有一个这个活动的activity会报错,如果多个则是没有category
- 属性的被忽略不可见 -->
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </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,从而完成匹配。
-
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("http://www.baidu.com"));
- 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代表单个,后面是子类型同上。
- Intent intent = new Intent(actionName);
-
- intent.setType("vnd.android.cursor.dir/vnd.smile.second");
- startActivity(intent);
intent在调用其他组件的同时也可以将一些必要信息传递过去,调用intent的setExtras方法,参数可以是一个string类型的key,和一个object类型的value,另一种方法是直接传递一个Bundle,Bundle就是把数据打个包运过去,其实功能和上面方法没什么太大区别。两种方式不能同时使用,否则最后面的将覆盖前面的。
-
- Intent intent = new Intent(actionName);
- intent.setTyp("vnd.android.cursor.dir/vnd.smile.second");
- Bundle b = new Bundle();
- b.putString("name", "smilebundle");
- intent.putExtras(b);
- startActivity(intent);
-
- Intent intent = this.getIntent();
- Bundle b = intent.getExtras();
- System.out.println(b.getString("name"));
-
- Intent intent = new Intent(actionName);
- intent.setType("vnd.android.cursor.dir/vnd.smile.second");
- intent.putExtra("name", "smile");
- startActivity(intent);
-
- Intent intent = this.getIntent();
- String str = 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" />否则系统找不到。
-
- Intent intent = new Intent(actionName);
- intent.addCategory(Intent.CATEGORY_EMBED);
- startActivity(intent);
配置文件需要注册,上面actionName是一个变量内容应该为下面的活动名称
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.EMBED"/>
- <action android: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,但是加上不影响什么。