Intent的中文意思是“意图,意向”,可以把它理解为不同组件之间的通信“媒介”或者“信使”。Intent可以启动一个Activity,也可以启动一个service,还可以发起一个广播(Broadcast)。Intent由以下几个部分组成:动作(Action)、数据(Data)、分类(Category)、类型(Type)、组件(Component)和扩展信息(Extra)。通过这些可以启动其他组件并携带信息。Intent在寻找目标组件时有两种方法:第一,通过组件名称指定;第二,通过Intent Filter过滤指定。
1、Intent的ComponentName属性
Intent的查找组件策略,其中一种方法就是显式查找,就是直接通过组件名称(Component Name)来查找。Intent的组件名称对象由ComponentName类封装,组件名称包含包名称和类名称,被声明在AndroidManifest.xml文件中。组件名称通过setComponent (ComponentName component)、setClass (Context packageContext, Class<?> cls)、setClassName (Context packageContext, String className)、setClassName (String packageName, String className)设置。
如在FirstActivity通过组件名称启动SecondActivity实现如下:
//实例化组件名称
ComponentName cn = new ComponentName(FirstActivity.this, "com.igood.test.SecondActivity");
//实例化Intent对象
Intent intent = new Intent();
//为Intent设置组件名称属性
intent.setComponent(cn);
//启动Activity
startActivity(intent);
2、Intent的Action属性
Action是指Intent要完成的动作,是一个字符串常量。在Intent类里面定义了大量常量属性,例如:ACTION_CALL(打电话)、ACTION_EDIT(编辑数据)、ACTION_BATTERY_LOW(电量低广播Action)等。使用getAction来获得Intent的Action属性。
2.1、自定义Action属性
我们可以为Intent定义一个Action属性来访问,Action属性是一个字符串,我们在程序中定义,并在要访问的组件(例如Activity)的IntentFilter中声明就可以使用了。如下面演示在FirstActivity中自定义一个Intent Action属性,并通过这个属性启动SecondActivity。
在FirstActivity类的顶部声明Action属性字符串常量,在Button的单击监听器方法中创建Intent,设置Action属性,并启动Activity。
public static final String MY_ACTION = "com.igood.test.MY_ACTION";
//实例化Intent对象
Intent intent = new Intent();
//为Intent设置Action属性
intent.setAction(MY_ACTION);
//启动Activity
startActivity(intent);
在AndroidManifest.xml配置文件中的SecondActivity声明中,在IntentFilter元素中指定Action属性。
2.2、访问系统Action属性
Android Intent类中定义了很多Action属性常量,这些有标准Activity的和Broadcast Receiver的。标准Activity Action如下表所示:
常量名称 | 常量值 | 意义 |
ACTION_MAIN | android.intent.action.MAIN | 应用程序的入口 |
ACTION_VIEW | android.intent.action.VIEW | 显示数据给用户 |
ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指明附加给其他地方的一些数据 |
ACTION_EDIT | android.intent.action.EDIT | 显示可编辑的数据 |
ACTION_PICK | android.intent.action.PICK | 选择数据 |
ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个Activity选择器 |
ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 获得内容 |
ACTION_DIAL | android.intent.action.DIAL | 显示打电话面板 |
ACTION_CALL | android.intent.action.CALL | 直接打电话 |
ACTION_SEND | android.intent.action.SEND | 直接发短信 |
ACTION_SENDTO | android.intent.action.SENDTO | 选择发短信 |
ACTION_ANSWER | android.intent.action.ANSWER | 答应电话 |
ACTION_INSERT | android.intent.action.INSERT | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 同步数据 |
ACTION_PICK_ACTIVITY | android.intent.action.PICK_ACTIVITY | 选择Activity |
ACTION_SEARCH | android.intent.action. SEARCH | 搜索 |
ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | Web搜索 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试入口点 |
例如,我们实现一个发短信的程序,在这个程序中,我们需要选择对方的电话号码,这时候我们可以调用系统电话本来查找电话号码。我们可以使用Intent.ACTION_GET_CONTENT常量调用系统Activity来实现该功能。
//创建Intent
Intent intent = new Intent();
//设置Intent Action属性
intent.setAction(Intent.ACTION_GET_CONTENT);
//设置Intent Type属性
intent.setType("vnd.android.cursor.item/phone");
//启动Activity
startActivity(intent);
3、Intent的Data属性
Intent的Data属性是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。例如,ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应该和要显示的URI匹配。
Action属性 | Data属性 | 说明 |
ACTION_VIEW | content://contacts/people/1 | 显示_id为1的联系人信息 |
ACTION_DIAL | content://contacts/people/1 | 将_id为1的联系人电话号码显示在拨号界面中 |
ACTION_VIEW | tel:123 | 显示电话为123的联系人信息 |
ACTION_VIEW | http://www.google.com | 在浏览器中浏览该网址 |
ACTION_VIEW | file://sdcard/mymusic.mp3 | 播放MP3 |
ACTION_VIEW | geo:39.3256.116.2312 | 显示地图 |
//创建Intent
Intent intent = new Intent();
//通过Uri字符串获得Uri实例
Uri uri = Uri.parse("content://contacts/people/1");
//设置Intent的Action属性
intent.setAction(Intent.ACTION_VIEW);
//设置Intent的data属性
intent.setData(uri);
//启动Activity
startActivity(intent);
4、Intent的Category属性
Intent中的Category属性是一个执行Action附加信息。例如,CATEGORY_LAUNCHER意味着在加载程序时,Activity出现在最上面。还有CATEGORY_HOME则表示回到Home界面。
//创建Intent
Intent intent = new Intent();
//设置Intent的Action属性
intent.setAction(Intent.ACTION_MAIN);
//设置Intent的data属性
intent.addCategory(Intent.CATEGORY_HOME);
//启动Activity
startActivity(intent);
4、Intent的Extras属性
Intent中的Extras属性是添加一些组件的附近信息。例如,如果我们要通过一个Activity来发送一个E-Mail,就可以通过Extras属性来添加subject和body。
//邮件目标地址
String to = toEditText.getText().toString();
//邮件主题
String subject = subjectEditText.getText().toString();
//邮件内容
String content = contentEditText.getText().toString();
//创建Intent
Intent emailIntent = new Intent(Intent.ACTION_SEND);
//设置内容类型
emailIntent.setType("plain/text");
//设置额外信息
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{to});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, content);
//启动Activity
startActivity(emailIntent);