【Android学习笔记】Android中Intent的应用方法探索

转自: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.   
  4. // 调用setClass方法参数为,<当前上下文可以用当前Activity.this获得因为Activity类继承了Context类><要调用的类>  
  5. intent.setClass(FirstActivity.this, SecondActivity.class);  
注意:使用以上的基本方法至少要在Manifest文件中注册Activity名称,否则系统将无法找到它。

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

二、关于Intent的隐式调用:

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

[java]  view plain copy print ?
  1. // 利用普通方法传递数据  
  2. Intent intent = new Intent(actionName);  
  3. intent.setType("vnd.android.cursor.dir/vnd.smile.second");  
  4. intent.putExtra("name""smile");     
  5. startActivity(intent);    
  6. // 取出数据  
  7. Intent intent = this.getIntent();  
  8. 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" />否则系统找不到。

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

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

[html]  view plain copy print ?
  1. <category android:name="android.intent.category.DEFAULT"/>  
  2. <category android:name="android.intent.category.EMBED"/>  
  3. <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,但是加上不影响什么。

你可能感兴趣的:(【Android学习笔记】Android中Intent的应用方法探索)