Intent是应用程序之间通信的重要媒介,Activity、Service、BroadcastReceiver都是依靠Intent来进行启动的。
Intent对象大致包含了Component、Action、Category、Data、Type、Extra、Flag这七种属性。
Component:用于确定指定需求启动的目标组件
Action:代表该Intent所要完成的一个抽象动作
Category:用于为Action增加额外的附加类别信息,通常Action会与Category结合使用
Data:通常用于向Action属性提供操作的数据
Type:用于指定该Data所指定Uri对应的MIME类型
Extra:通常用于在多个Activity之间进行数据交换
Flag:用于为该Intent添加一些额外的控制旗标,Intent可调用addFlags()方法来为Intent添加控制旗标。
下面将介绍Intent对象各属性的作用:
1.Component属性
Intent的Component属性需要接受一个ComponentName对象
// 创建一个ComponentName对象
ComponentName comp = new ComponentName(MainActivity.this, TwoActivity.class);
Intent intent = new Intent();
// 为Intent设置Component属性
intent.setComponent(comp);
// Intent intent = new Intent(MainActivity.this, TwoActivity.class);
startActivity(intent);
下面来显示Activity对应Intent的Component属性的包名、类名
// 获取该Activity对应的Intent的Component属性
ComponentName comp = getIntent().getComponent();
// 显示该ComponentName对象的包名、类名
show.setText("组件包名为:" + comp.getPackageName() + "\n组件类名为:" + comp.getClassName());
// 运行结果:组件包名为:com.gc.component
// 组件类名为:com.gc.component.TwoActivity
2.Action、Category属性和intent-filter配置
Android提供的标准Action:Intent.ACTION_VIEW(表示一个抽象的查看操作),具体查看什么,启动哪个Activity来查看取决于Activity的intent-filter配置中包含了该ACTION_VIEW,该Activity就有可能被启动。
1)我们来实现一下点击按钮为Intent指定Action跳转TwoActivity,如下:
// 创建Intent对象
Intent intent = new Intent();
// 为Intent设置Action属性(属性值就是一个普通字符串)
intent.setAction("com.gc.intent.action.CRAZYIT_ACTION");
startActivity(intent);
接下来配置intent-filter元素(用于配置Activity响应的Intent),intent-filter元素通常包括Action、Category、Data子元素
<activity android:name=".TwoActivity" android:label="@string/app_name">
<intent-filter>
<!-- 指定该Activity能响应Action为指定字符串的Intent -->
<action android:name="com.gc.intent.action.CRAZYIT_ACTION" />
<!-- 指定该Activity能响应Action属性为helloWorld的Intent -->
<action android:name="helloWorld" />
<!-- 指定该Action能响应Category属性为指定字符串的Intent -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
接下来我们在开启的TwoActivity中获取该Activity对应的Intent的Category属性
Set<String> cates = getIntent().getCategories();
2)指定Action、Category调用系统Activity
Android内部提供了大量标准的Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如下:
Action常量 | 对应字符串 | 简单说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.action.VIEW | 显示指定数据 |
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_SEARCH | android.intent.action.SEARCH | 执行搜索 |
标准Category常量及对应字符串如下:
Category常量 | 对应字符串 | 简单说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认Category |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 指定该Activity能被浏览器安全调用 |
CATEGORY_TAB | android.intent.category.TAB | 指定Activity作为TabActivity的Tab页 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | Activity显示在顶级程序列表中 |
CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
CATEGORY_HOME | android.intent.category.HOME | 设置该Activity随系统启动而运行 |
CATEGORY_CAR_DOCK | android.intent.category.CAR_DOCK | 指定手机被插入汽车硬件时运行该Activity |
CATEGORY_DESK_DOCK | android.intent.category.DESK_DOCK | 指定手机被插入桌面硬件时运行该Activity |
CATEGORY_CAR_MODE | android.intent.category.CAR_MODE | 指定该Activity可在车载环境下使用 |
3)我们设置一个按钮,点击将返回系统Home界面,按钮的点击事件如下:
// 创建Intent对象
Intent intent = new Intent();
// 为Intent设置Action、Category属性
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
3.Data、Type属性
Data通常用于向Action属性提供操作的数据,Type用于指定该Data所指定Uri对应的MIME类型。
1)Data和Type关系微妙,会相互覆盖:
Intent先设置Data,后设置Type,那么Data被覆盖;
Intent先设置Type,后设置Data,那么Type被覆盖;
如果希望两者都存在,则应调用Intent的setDataAndType()方法。
Data属性接收一个Uri对象,一个Uri对象通常表示形式如下:
scheme://host:port/path
// 例如:content://com.android.contacts/contacts/123
2)接下来使用Action、Data属性启动系统Activity浏览指定网页,点击事件如下:
// 创建Intent
Intent intent = new Intent();
String data = "http://www.126.com";
// 根据指定字符串解析出Uri对象
Uri uri = Uri.parse(data);
// 为Intent设置Action属性
intent.setAction(Intent.ACTION_VIEW);
// 设置Data属性
intent.setData(uri);
startActivity(intent);
本篇介绍总结了Android系统中Intent的功能和用法,当Activity应用需要启动某个组件时,总需要借助Intent来实现,还有启动Service、BroadcastReceiver组件也都是由Intent来实现的。