Intent属性详解
# 1.Intent简介
在Android操作系统中,Intent(意图)主要用于激活系统组件,在组件之间传递数据
- Intent也可以实现调用Android系统内置的功能,如打电话
- Intent理解为组件之间的[连机器],可用于激活Activity、Service、BroadcastReceiver,但不能激活Content Provider
Inten不是系统组件,它由开发人员创建并维护
组件的特点:
- 它的类必须实现特定接口或继承特定类
- 需要在配置文件中配置全类名
- 它的对象不是
new
来创建的,而是系统自动创建- 它的对象具有一定的生命周期,类中有对应的生命周期回调方法
# 2.Intent在组件之间传递数据
在Activity中,激活另一个Activity时可以在Intent对象中封装数据
# 3.Intent核心属性
# 3.1 Component Name(显示意图)
Component Name表示组件名称,使用Intent激活系统组件时,通过设置该属性值来显示确定被激活的组件。
Component Name属性的数据类型是ComponentName。
通过Intent的构造方法、setCoponent()
、setClass()
、setClassName()
均可以设置Component Name属性的值。
设置Component Name属性值(效果相同)
# 3.2 Action(隐示意图)
Action表示动作,通常用于隐式激活组件,即不指定组件的名称。这样的Intent被称之为“隐式意图”;
- Action属性的数据类型是String类型。
- Android系统在Intent类中定义了系列以ACTION_为前缀的常量,例如ACTION_DIAL,可用于激活系统的拨号程序。
- 通过setAction()方法可以设置Action属性的值。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
2
3
# 3.3 Data
不要使用Data封装与Action无关的数据
Data表示数据,通常与Action属性匹配使用,用于指定某个动作所需要的或被操作的数据。
- Data属性的数据类型是Uri类型,该类型的数据可以通过
Uri.parse()
将字符串转换得到。 - 通过Intent的构造方法、setData()方法可以设置Data属性的值。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel//110"));
startActuvuty(intent);
// Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel//110"));
2
3
4
5
6
Data属性实际上包括Uri和Type这2个部分,分别表示“通用资源标识符URI” 和 数据的 "MIME类型"。
- 通过setType()方法、setDataAndType()方法可以设置Type属性的值。
Intent intent = new Intent();
intent.setDataAndType(Uri.parse("file:///mnt/sdcard/demo.mp3"),"audio/mp3");
2
在大多数应用场景中,可以不指定Type属性,如果不指定,系统会根据Uri的内容添加Type。
# 3.4 Category
Category表示分类,用于表示组件的类别,在Intent对象中,可以添加多个Category。
Category属性的数据类型是String类型。
涉及Category时,通常应用于隐式意图,且存在Intent Filter(意图过滤器),Intent与Intent Filter存在匹配关系时,才可以隐式激活组件。
Android系统定义了一些以CATEGORY_为前缀的常量:
- CATEGORY_DEFAULT: 默认的;
- CATEGORY_LAUNCHER: 入口Activity的分类;
- CATEGORY_BROWSABLE: 可以被浏览器触发的分类;
- CATEGORY_HOME: 显示HOME界面的分类;
# 3.5 Extra
Extra表示附加信息,用于封装在组件之间传递的数据。 Extra属性的数据类型是Bundle类型,其本质是操作一个Key的类型固定为String的HashMap。通过putExtras()方法可将Bundle类型的数据设置为Extra属性的值。
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
// 使用Bundle-putExtras
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putString("name", name);
intent.putExtras(bundle);
// intent-putExtra
intent.putExtra("id", id);
intent.putExtra("name", name);
2
3
4
5
6
7
8
9
Intent类重载了多次putExtra()方法,用于附加不同类型的数据,并定义了匹配的get方法,例如getStringExtra()、getIntExtra()等。
对于获取基本值的get类型方法,都有第2个参数表示默认值,例如getIntExtra(String name,int defaultValue),第2个参数仅当根据name参数获取值失败时作为该方法的返回值。
Intent intent = getIntent();
int id = intent.getIntExtra("id", -1); // 指定默认值,防止获取不到的情况
String name = intent.getStringExtra("name"); // 不是基本类型,不用指定,默认为null
2
3
# 3.6 Flag
Flag表示标志,通常用于指定Intent对象的一些特殊意义。例如在 Activity的Back Stack的处理中,通过设置Flag属性确定Activity归属于某个Task,或在广播中,设置是否仅动态注册的接收者才可以接收等。
Flag属性的数据类型是Integer类型,通过setFlags()
方法可以设置Flag属性的值。
# 4. Intent类型
Intent 分为两种类型:
- 显式 Intent:通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
- 隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
图 1 显示如何在启动 Activity 时使用 Intent。当
Intent
对象显式命名某个具体的 Activity 组件时,系统立即启动该组件。
图 1. 隐式 Intent 如何通过系统传递以启动其他 Activity:[1] Activity A 创建包含操作描述的 Intent
,并将其传递给 startActivity()
。[2] Android 系统搜索所有应用中与 Intent 匹配的 Intent 过滤器。找到匹配项之后,[3] 该系统通过调用匹配 Activity (Activity B) 的 onCreate()
方法并将其传递给 Intent
,以此启动匹配 Activity。