Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
(1)启动 Activity
(2)启动服务
(3)传递广播
本文将从Intent类型,构建Intent,包括Intent的五个部分来讲解Intent。
一、Intent的类型
(1)显示Intent
按名称(完全限定类名)指定要启动的组件。 通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名
(2)隐式Intent
隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。 例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
二、构建Intent
Intent 对象携带了 Android 系统用来确定要启动哪个组件的信息(例如,准确的组件名称或应当接收该 Intent 的组件类别),以及收件人组件为了正确执行操作而使用的信息(例如,要采取的操作以及要处理的数据)。
Intent 中包含的主要信息如下:
(1)组件名称
Intent intent = new Intent();
intent.setClass(ActivityA.this, ActivityB.class);
Intent intent = new Intent();
intent.setClassName(ActivityA.this, ActivityB.class.getName());
Intent intent = new Intent();
intent.setComponent(new ComponentName(ActivityA.this, ActivityB.class));
注:启动 Service 时,您应始终指定组件名称。 否则,您无法确定哪项服务会响应 Intent,且用户无法看到哪项服务已启动。
(2)操作
引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。提供的数据类型通常由 Intent 的操作决定。例如,如果操作是 ACTION_EDIT,则数据应包含待编辑文档的 URI。
注意:若要同时设置 URI 和 MIME 类型,请勿调用 setData() 和 setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。
原理图:
例子(分享内容):
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
intent.setType("text/plain");
startActivity(intent);
例子(打电话)
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
常用的Action
设置待操作的数据URI或者数据的MIME类型
setData()
setType()
setDataAndType()
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:1320010001"));
startActivity(intent);
常用Data
注:若要同时设置 URI 和 MIME 类型,请勿调用 setData() 和 setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。
(3)Extra
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("Message", "This message from Activity A!");
startActivity(intent);
Intent intent = getIntent();
String msg = intent.getStringExtra("Message");
(4)类别
一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别。 以下是一些常见类别:
CATEGORY_BROWSABLE
目标 Activity 允许本身通过网络浏览器启动,以显示链接引用的数据,如图像或电子邮件。
CATEGORY_LAUNCHER
该 Activity 是任务的初始 Activity,在系统的应用启动器中列出。
您可以使用 addCategory() 指定类别。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL); intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
<activity android:name=".ActivityA">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(5)标志
在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的 Activity 列表)。
Intent intent = new Intent();
intent.setClass(this, ActivityC.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
清除上层的Activity
Intent intent = new Intent();
intent.setClass(this, ActivityC.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
全部Flag的地址:
https://developer.android.com/reference/android/content/Intent.html#setFlags(int)
Intent Filter
<activity android:name="ShareActivity">
<!-- This activity handles "SEND" actions with text data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
<!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.google.panorama360+jpg"/>
<data android:mimeType="image/*"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>
Intent官方文档:
https://developer.android.com/reference/android/content/Intent.html