1.Intent类简介

所谓Intent,就是一种运行时的绑定机制,在应用程序运行时连续两个不同的组件。一般的应用都通过Intent向Android系统发出某种请求,然后Android系统会根据请求查询各个组件声明的IntentFilter,找到需要的组件并运行它。

Activity、Service及BroadcastReceiver组件之间的通信全部使用的是Intent,但是各个组件使用的Intent机制不同。

(1)Activity组件

当需要激活一个Activity组件时,需要调用Context.startActivity或Context.startActivityForResult方法来传递Intent,此时的Intent参数称做Activity Action Intent。

(2)Service组件

当需要启动或绑定一个Service组件时,会通过Context.startService或Context.bindService方法实现Intent的传递。

(3)BroadcastReceiver组件

BroadcastIntent一般是通过Context.sendBroadcast()、sendOrderedBroadcast()或sendStickyBroadcast()方法传递的,当BroadcastIntent被广播后,所有IntentFilter过滤条件满足的组件都将被激活。


Intent是由组件名称、Action、Data、Category、Extra及Flag六部分组成的,接下来将分别对其进行详细介绍。

(1)组件名称

组件名称实际上就是一个ComponentName对象,用于标识唯一的应用程序组件,即指明了期望的Intent组件,这种对象的名称是由目标组件的类名与目标组件的包名组合而成的。在Intent传递过程中,组件名称是一个可选项,当指定它时,便是显式的Intent消息,当不指定它时,Android系统则会根据其他信息及IntentFilter的过滤条件选择相应的组件。

(2)Action

Action实际上就是一个描述了Intent所触发动作名称的字符串,在Intent类中,已经定义好多字符串常量来表示不同的Action,当然,开发人员也可以自定义Action,其定义规则同样非常简单。

系统定义的Action常量有很多,下面只列出其中一些较常见的。

  • ACTION_CALL,拨出Data里封装的电话号码。
  • ACTION_EDIT,打开Data里指定数据所对应的编码程序。
  • ACTION_VIEW,打开能够显示Data中封装的数据的应用程序。
  • ACTION_MAIN,声明程序的入口,该Action并不会接收任何数据,同时结束后也不会返回任何数据。
  • ACTION_BOOT_COMPLETED,BroadcastReceiver Action的常量,表明系统启动完毕。
  • ACTION_TIME_CHANGED,BroadcastReceiver Action的常量,表示系统时间通过设置而改变。

(3)Data

Data主要是对Intent消息中数据的封装,主要描述Intent的动作所操作到的数据的URI及类型。不同类型的Action会有不同的Data封装,例如打电话的Intent会封装tel://格式的电话URI,而ACTION_VIEW的Intent中Data则会封装http:格式的URI。正确的Data封装对Intent匹配请求同样非常重要。

(4)Category

Category是对目标组件类别信息的描述。同样作为一个字符串对象,一个Intent中可以包含多个Category。与Category相关的方法有三个,addCategory添加一个Category,removeCategory删除一个Category,而getCategories得到一个Category。Android系统同样定义了一组静态字符常量来表示Intent的不同类别,下面列出一些常见的Category常量。

  • CATEGORY_GADGET,表示目标Activity是可以嵌入到其他Activity中的。
  • CATEGORY_HOME,表明目标Activity为HOME Activity。
  • CATEGORY_TAB,表明目标Activity是TabActivity的一个标签下的Activity。
  • CATEGORY_LAUNCHER,表明目标Activity是应用程序中最先被执行的Activity。
  • CATEGORY_PREFERNCE,表明目标Activity是一个偏好设置的Activity。

(5)Extra

Extra中封装了一些额外的附加信息,这些信息是以键值对的形式存在的。Intent可以通过putExtras()与getExtras()方法来存储和获取Extra。在Android系统的Intent类中,同样对一些常用的Extra键值进行了定义,如下所示。

  • EXTRA_BCC,装有邮件密送地址的字符串数组。
  • EXTRA_EMAIL,装有邮件发送地址的字符串数组。
  • EXTRA_UID,使用ACTION_UID_REMOVED动作时,描述删除用户的id。
  • EXTRA_TEXT,当使用ACTION_SEND动作时,描述要发送文本的信息。

(6)Flag

一些有关系统如何启动组件的标志位,Android同样对其进行了封装。


2.IntentFilter的简介

IntentFilter实际上相当于Intent的过滤器,一个应用程序开发完成后,需要告诉Android系统自己能够处理哪些隐形的Intent请求,这就需要声明IntentFilter。IntentFilter的使用方法实际上非常简单,仅声明该应用程序接收什么样的Intent请求即可。

IntentFilter过滤Intent时,一般是通过Action、Data及Category三方面进行监测的。接下来分别对这三方面进行介绍。

(1)检查Action

一个Intent只能设置一种Action,但是一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action时,只需一个满足即可完成Action验证。

当IntentFilter中没有说明任何一个Action时,那么任何的Action都不会与之匹配。而如果Intent中没有包含任何Action,那么只要IntentFilter中含有Action时,便会匹配成功。

(2)检查Data

数据的监测主要包含两部分,即数据的URI及数据类型,而数据URI又被分成三部分进行匹配(scheme、authority、path),只有这些全部匹配时,Data的验证才会成功。

(3)检查Category

IntentFilter同样可以设置多个Category,当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category的检查,而其他的Category并不受影响。但是当IntentFilter没有设置Category时,只能与没有设置Category的Intent相匹配。

(4)Intent的案例

接下来将通过一个简单的案例来介绍Intent的使用方法,下面的案例是一个应用程序,然后判断输入的电话号码是否符合规范。当符合规范时,调用系统自带的拨号程序进行拨号。该案例的开发步骤如下。

1)创建一个名为Android_Sample_2_7的Android项目

image

2)开发res/values下的strings.xml,其代码如下所示。

  1: <?xml version="1.0" encoding="utf-8"?>
  2: <resources>
  3:     <string name="app_name">CallIntentDialExample</string>
  4:     <string name="call">呼叫</string>
  5:     <string name="tel">13888888888</string>
  6: </resources>

3)编写res/layout目录下的main.xml文件,代码如下所示。

  1: <?xml version="1.0" encoding="utf-8"?>
  2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3:     android:layout_width="fill_parent"
  4:     android:layout_height="fill_parent"
  5:     android:orientation="vertical" >
  6: 
  7:     <!-- android:inputType="number|phone" -->
  8:     <EditText
  9:         android:id="@+id/myEditText"
 10:         android:layout_width="fill_parent"
 11:         android:layout_height="wrap_content"
 12:         android:text="@string/tel" >
 13:     </EditText>
 14: 
 15:     <Button
 16:         android:id="@+id/Button01"
 17:         android:layout_width="fill_parent"
 18:         android:layout_height="wrap_content"
 19:         android:text="@string/call"
 20:         android:textSize="24dip" >
 21:     </Button>
 22: </LinearLayout>

4)开发该案例的主要逻辑代码,首先打开src/wyf/ytl目录下的Android_Sample_2_7Activity.java,然后用下列代码替换原有代码。

  1: package wyf.ytl;
  2: 
  3: import android.app.Activity;
  4: import android.content.Intent;
  5: import android.net.Uri;
  6: import android.os.Bundle;
  7: import android.telephony.PhoneNumberUtils;
  8: import android.view.View;
  9: import android.widget.Button;
 10: import android.widget.EditText;
 11: import android.widget.Toast;
 12: 
 13: public class Android_Sample_2_7Activity extends Activity {
 14: 	@Override
 15: 	public void onCreate(Bundle savedInstanceState) {
 16: 		super.onCreate(savedInstanceState);
 17: 		setContentView(R.layout.main);
 18: 		Button bCall = (Button) this.findViewById(R.id.Button01);// 得到按钮的引用
 19: 		bCall.setOnClickListener(new View.OnClickListener() {
 20: 
 21: 			@Override
 22: 			public void onClick(View v) {
 23: 				EditText eTel = (EditText) findViewById(R.id.myEditText);
 24: 				String strTel = eTel.getText().toString();// 得到输入的文本
 25: 				// 判断号码字符串是否合法
 26: 				if (PhoneNumberUtils.isGlobalPhoneNumber(strTel)) {
 27: 					Intent i = new Intent(Intent.ACTION_DIAL, Uri
 28: 							.parse("tel://" + strTel));
 29: 					Android_Sample_2_7Activity.this.startActivity(i);// 启动拨号程序
 30: 				} else {
 31: 					Toast.makeText(Android_Sample_2_7Activity.this,
 32: 							"电话号码不符合格式!!!", 5000).show();
 33: 				}
 34: 			}
 35: 		});
 36: 	}
 37: }

第18行得到在main.xml中配置的按钮的应用。

第19~35行为按钮添加监听器。在该监听器的监听方法中,第24行先得到输入的文本信息,然后在第26~28行判断输入文本的合法性,当符合规则时,启动拨号程序;当不符合时,使用Toast提示用户输入的电话号码不符合格式。在代码的第27行创建相应的Intent,然后在29行将Intent发送出去。

运行结果如下图:

image

点击按钮“呼叫”,启动拨号界面。

image

如果输入错误的电话号码。

image

点击按钮“呼叫”后,直接弹出提示错误信息。

image

作者:银月莲
出处:http://www.cnblogs.com/moonsilvering
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,包括文章,代码,图片等本站内所有资源,否则保留追究法律责任的权利。

posted on 2011-12-27 00:38  银月莲  阅读(642)  评论(0编辑  收藏  举报