Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个
- 启动Activity
startActivity()、如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult()。 - 启动服务
通过将Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。
如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务。 - 传递广播
通过将Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或sendStickyBroadcast(),您可以将广播传递给其他应用。
Intent类型
- 显式Intent
- 隐式Intent
隐式 Intent 如何通过系统传递以启动其他 Activity 的图解:[1] Activity A 创建包含操作描述的 Intent,并将其传递给 startActivity()。[2] Android 系统搜索所有应用中与 Intent 匹配的 Intent 过滤器。 找到匹配项之后,[3] 该系统通过调用匹配 Activity(Activity B)的 onCreate() 方法并将其传递给 Intent,以此启动匹配 Activity。
构建Intent
- 组件名称ComponentName
Intent的Component属性需要接受一个ComponentName对象
这是可选项,但也是构建显式 Intent 的一项重要信息, 如果没有组件名称,则 Intent 是隐式的。
public Intent(Context packageContext, Class<?> cls)
该构造方法使用传入的参数来获取Intent需要的ComponentName。ComponentName由包名和类名共同组成。传入Activity和Class创建Intent时,构造方法会通过Activity类自行确定全路径包名。
也可以自己通过包名和类名创建ComponentName,然后使用下面的Intent方法创建显式intent:
public Intent setComponent(ComponentName component)
除此之外setClassName(…)方法能够自动创建组件名,所以使用该方法需要的实现代码相对较少。
public Intent setClassName(String packageName, String className)
例子:获取手机里app的名字和图标
Intent startupIntent = new Intent(Intent.ACTION_MAIN);
startupIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pm=getActivity().getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(startupIntent, 0);
ResolveInfo mResolveInfo = mActicities.get(position);
String appName = mResolveInfo.loadLabel(pm).toString();
Drawable appImage=mResolveInfo.loadIcon(pm);
操作Action
代表Intent所要完成的抽象动作。
一个Intent对象最多只能包含一个Action属性。
调用setAction(String)方法。
常见的操作:ACTION_VIEW,ACTION_SEND
如果定义自己的操作,请确保将应用的软件包名称作为前缀。例如:
static final String ACTION_TIMETRAVEL = “com.example.action.TIMETRAVEL”;类别Category
一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别。
可以使用addCategory()指定类别。可以指定多个
以下是一些常见类别:- CATEGORY_BROWSABLE
目标 Activity 允许本身通过网络浏览器启动,以显示链接引用的数据,如图像或电子邮件。 - CATEGORY_LAUNCHER
该 Activity 是任务的初始 Activity,在系统的应用启动器中列出 - CATEGORY_DEFAULT
当创建Intent时默认的category属性为CATEGORY_DEFAULT(因此在被启动的Activity的配置元素的<intent-filter/>
中要包含对应的类别)
- CATEGORY_BROWSABLE
Data和Type
Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象。
URI结构
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>
例如:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
Android URI简介
URI中没有指定scheme 那么URI无效。没有指定Host,URI无效。
Type属性用于指定改Data属性所指定Uri对应的MIME类型,这种MIME可以是自定义的类型,只要符合abc/xyz格式的字符串即可。例如:“text/plain”。若要同时设置 URI 和 MIME 类型,请勿调用 setData() 和 setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。
Extra
携带完成请求操作所需的附加信息的键值对。通过Intent在多个Activity之间进行数据交互。
可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。您还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将Bundle 插入 Intent 中。
如需声明自己的 extra 键(对于应用接收的 Intent),请确保将应用的软件包名称作为前缀。 例如:
static final String EXTRA_XXXXX = “com.example.EXTRA_XXXXX”;- 标志Flags
在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的 Activity 列表)。
Intent过滤器
<action/>
在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。
可以有0~N个<action/>
元素.<category/>
在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。
可以有0~N个<category/>
元素<data/>
使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。
Intent必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data(过滤规则中出现的data部分也出现在了Intent的data中)。
可以有0~1个<data/>
元素
<data android:mimeType=""
android:scheme=""
android:host=""
android:port=""
android:path=""
android:pathPrefix=""
android:pathPattern=""
/>
mimeType是指媒体类型,比如image/jpeg,audio/mpeg4-generic,video/* 等
匹配规则:
1. 过滤器只设置了mimeType类型
Intent中的mimeType属性必须一致才能匹配。
URI就为默认值即schema必须为content或file才能匹配。
2. 既有URI又有mimeType
intent的setDataAndType 就需一样
在过滤规则中如下两种方法一样
<data android:scheme="file" android:host="www.baidu.com"/>
或
<data android:scheme="file" />
<data android:host="www.baidu.com"/>