Intent 概述
一个 Android 程序主要是由 Activity、Service 和 BroadcastReceiver 三种组件组成,这三种组件是独立的,它们之间可以互相调用、协调工作,最终组成一个真正的 Android 程序。这些组件之间的通讯主要由Intent协助完成。Intent负责对应用中一次操作的Action(动作)、Action涉及的Data(数据)、Extras(附加数据)进行描述,Android 则根据 Intent 的描述,找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用。因此,Intent 在这里起着一个媒体中介的作用,专门提供组件间互相调用的相关信息,实现调用者与被调用者之间的解耦。
例如,在一个联系人维护的应用中,在联系人列表界面(假设对应的 Activity 为 ListActivity)中,如图 1 所示,当单击联系人 Mr 后,会打开该联系人的详细信息界面(假设对应的 Activity 为DetailActivity),如图 1 所示。为了实现这个目的,ListActivity需要构造一个Intent,这个Intent用于告诉系统:需要完成“查看”动作,而此动作对应的查看对象是“某联系人”;然后调用 startActivity(Intent intent) 方法,并将构造的 Intent 传入,系统会根据此 Intent 中的描述,在 AndroidManifest.xml 文件中找到满足此 Intent要求的 Activity(即 DetailActivity);最后,DetailActivity 会根据此 Intent 中的描述,执行相应的操作,如图 1 所示。
Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
- 启动 Activity
Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 用于描述要启动的 Activity,并携带任何必要的数据。如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,您的 Activity 将结果作为单独的 Intent 对象接收。如需了解详细信息,请参阅 Activity 指南。 - 启动服务
Service 是一个不使用用户界面而在后台执行操作的组件。使用 Android 5.0(API 级别 21)及更高版本,您可以启动包含 JobScheduler 的服务。对于 Android 5.0(API 级别 21)之前的版本,您可以使用 Service 类的方法来启动服务。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何必要的数据。如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务。 - 传递广播
广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast() 或 sendOrderedBroadcast(),您可以将广播传递给其他应用。
本小节主要讲解示例主要使用Intent 启动 Activity,后面在Service 的应用和BroadcastReceiver 使用章节会分别讲解Intent 启动服务和Intent 传递广播的示例。
Intent 分为两种类型:
**显式 Intent:**通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
**隐式 Intent :**不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。