美文网首页
Intent对象

Intent对象

作者: Lexie_qiqi | 来源:发表于2020-03-20 23:33 被阅读0次

    Intent对象的介绍


    Intent 是一个消息传递(messaging)的对象,你可以从其他的应用组件用来请求一个action操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:

    1. Starting an activity启动Activity

    一个activity代表一个程序的单个界面,通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 用于描述要启动的 Activity,并携带任何必要的数据。

    如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,您的 Activity 将结果作为单独的 Intent 对象接收。

    2. Starting a service启动服务

    Service 是一个不使用用户界面而在后台执行操作的组件。使用 Android 5.0(API 级别 21)及更高版本,您可以启动包含 JobScheduler 的服务。

    对于 Android 5.0(API 级别 21)之前的版本,您可以使用 Service 类的方法来启动服务。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何必要的数据。

    如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务。

    3. Delivering a broadcast传递广播

    广播是一个任何应用都能接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast() 或 sendOrderedBroadcast(),您可以将广播传递给其他应用。


    Intent对象的组成


    Intent 对象携带 Android 系统用来确定要启动哪个组件的信息(例如,准确的组件名称或应当接收该 Intent 的组件类别),以及收件人组件为了正确执行操作而使用的信息(例如,要采取的操作以及要处理的数据)。

    1. 组件名称 Component name

    要启动的组件名称。

    这是可选项,但也是构建显式 Intent 的一项重要信息,这意味着 Intent 应当仅传递给由组件名称定义的应用组件。如果没有组件名称,则 Intent 则为隐式,且系统将根据其他 Intent 信息(例如,以下所述的操作、数据和类别)决定哪个组件应当接收 Intent。如需在应用中启动特定的组件,则应指定该组件的名称。

    Intent 的这一字段是 ComponentName 对象,您可以使用目标组件的完全限定类名指定此对象,其中包括应用的软件包名称。例如,com.example.ExampleActivity。您可以使用 setComponent()setClass()setClassName(),或 Intent 构造函数设置组件名称。

    2. 操作 Action

    指定要执行的通用操作(例如,查看  或 选取)的字符串。

    对于广播 Intent,这是指已发生且正在报告的操作。操作会在很大程度上决定其余 Intent 的构成,特别是数据和 extra 中包含的内容。您可以指定自己的操作,供 Intent 在您的应用内使用(或者供其他应用在您的应用中调用组件)。但是,您通常应该使用由Intent 类或其他框架类定义的操作常量。以下是一些用于启动 Activity 的常见操作:

    3. 数据 Data

    引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。提供的数据类型通常由 Intent 的操作决定。例如,如果操作是 ACTION_EDIT,则数据应包含待编辑文档的 URI。

    创建 Intent 时,除了指定 URI 以外,指定数据类型(其 MIME 类型)往往也很重要。例如,能够显示图像的 Activity 可能无法播放音频文件,即便 URI 格式十分类似时也是如此。因此,指定数据的 MIME 类型有助于 Android 系统找到接收 Intent 的最佳组件。但,有时 MIME 类型可以从 URI 中推断得出,特别当数据是 content: URI 时尤其如此。content: URI 表明数据位于设备中,且由 ContentProvider 控制,这使得数据 MIME 类型对系统可见。

    要仅设置数据 URI,请调用 setData()。要仅设置 MIME 类型,请调用 setType()。如有必要,您可以使用 setDataAndType() 同时显式设置二者。

    4. 类别 Category

    一个包含应处理Intent组件类型的附加信息的字符串,可以将任意数量的类别描述放入一个Intent中,但大多数Intent均不需要类别。

    CATEGORY_BROWSABLE

    目标 Activity 允许本身通过网络浏览器启动,以显示链接引用的数据,如图像或电子邮件。

    CATEGORY_LAUNCHER

    该 Activity 是任务的初始 Activity,在系统的应用启动器中列出。


    以上列出的这些属性(组件名称、操作、数据和类别)表示 Intent 的既定特征。通过读取这些属性,Android 系统能够解析应当启动哪个应用组件。但是,Intent 也有可能会携带一些不影响其如何解析为应用组件的信息。Intent 还可以提供以下信息:


    5. 附加信息 Extras

    携带完成请求操作所需的附加信息的键值对。正如某些操作使用特定类型的数据 URI 一样,有些操作也使用特定的 extra。

    您可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。您还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将 Bundle 插入 Intent 中。

    例如,使用 ACTION_SEND 创建用于发送电子邮件的 Intent 时,可以使用 EXTRA_EMAIL 键指定目标收件人,并使用 EXTRA_SUBJECT 键指定主题

    6. 标记 Flags

    标志在 Intent 类中定义,充当 Intent 的元数据。标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,Activity 是否属于最近的 Activity 列表)。


    如果xml中activity包含intent过滤器的化,可以接受显式或隐式的intent,如果不包含只能接受显式intent。显式 Intent 始终会传递给其目标,无论组件声明的 Intent 过滤器如何均是如此。

    应用组件应当为自身可执行的每个独特作业声明单独的过滤器。例如,图像库应用中的一个 Activity 可能会有两个过滤器,分别用于查看图像和编辑图像。当 Activity 启动时,将检查 Intent 并根据 Intent 中的信息决定具体的行为(例如,是否显示编辑器控件)。

    要公布应用可以接收哪些隐式 Intent,请在清单文件中使用 <intent-filter> 元素为每个应用组件声明一个或多个 Intent 过滤器。每个 Intent 过滤器均根据 Intent 的操作、数据和类别指定自身接受的 Intent 类型。仅当隐式 Intent 可以通过 Intent 过滤器之一传递时,系统才会将该 Intent 传递给应用组件。

    每个 Intent 过滤器均由应用清单文件中的 <intent-filter> 元素定义,并嵌套在相应的应用组件(例如,<activity> 元素)中。在 <intent-filter> 内部,您可以使用以下三个元素中的一个或多个指定要接受的 Intent 类型:

    <action>

    在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。eg. <action android:name="android.intent.action.SEND"/>

    <data>

    使用一个或多个指定数据 URI(scheme、host、port、path)各个方面和 MIME 类型的属性,声明接受的数据类型。eg. <data android:mimeType="text/plain"/>

    <category>

    在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。eg. <category android:name="android.intent.category.DEFAULT"/>

    Intent类型


    Intent 分为两种类型:

    显式 Intent:通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。

    隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。

    广播机制简介


    Android的每个应用程序都可以对自己感兴趣的广播进行注册,只接收自己所关心的广播内容

    广播可以来自于系统,也可以来自于应用程序。但广播可以在应用程序间相互传递。

    Android提供一套完整的API,用于应用程序发送和接收广播。

    xml中配置

    实例


    1. 实现打电话功能。

    每款Android应用都在访问受限的沙盒中运行。如果应用需要使用自己的沙盒外的资源或信息,则必须请求相应权限。要声明您的应用需要某项权限,可以在应用清单(AndroidManifest.xml)中列出该权限,然后在运行时请求用户批准每项权限。

    对于所有 Android 版本,要声明应用需要某项权限,请在应用清单中添加 <uses-permission> 元素,作为顶级 <manifest> 元素的子项。例如,需要访问互联网的应用需在清单中添加以下代码行:

    <uses-permission android:name="android.permission.INTERNET"/>

    需要打电话添加以下代码行:

    uses-permission声明需要使用的权限

    如果您的应用还不具备它需要的权限,那么它必须调用一个 requestPermissions() 方法来请求相应权限。您的应用将传递它想要的权限,以及您指定用于识别此权限请求的整数请求代码。此方法异步运行。它会立即返回结果,并且在用户响应提示后,系统会利用相应结果来调用应用的回调方法,在调用过程中传递的请求代码与应用传递给 requestPermissions() 的请求代码相同。

    requestPermissions请求权限

    2. 发送短信

    3. 当消息来到手机时,短消息提示

    系统广播,因此action是系统设置的。系统有敏感性操作时,要对xml配置文件进行许可的配置

    在主活动中要查询是否授权了许可,如果没有,仍要申请许可。

    在java的广播接收器类中,判断是否是intent的action,如果是,显示短消息

    相关文章

      网友评论

          本文标题:Intent对象

          本文链接:https://www.haomeiwen.com/subject/ebnqyhtx.html