现在的位置: 首页 > 综合 > 正文

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

2013年12月14日 ⁄ 综合 ⁄ 共 3977字 ⁄ 字号 评论关闭

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

一、关于Intent的显式调用:

  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名称,否则系统将无法找到它。

  1. <activity android:name=".SecondActivity"></activity>  


二、关于Intent的隐式调用:

  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属性,否则系统将无法找到它。

  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,从而完成匹配。

  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代表单个,后面是子类型同上。

  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就是把数据打个包运过去,其实功能和上面方法没什么太大区别。两种方式不能同时使用,否则最后面的将覆盖前面的。

  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"));      


  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" />否则系统找不到。

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


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

  1. <category android:name="android.intent.category.DEFAULT"/>  
  2. <category android:name="android.intent.category.EMBED"/>  
  3. <action 

抱歉!评论已关闭.