在前面的章节我们介绍到了 Activity、Service、BroadCastReceiver,这三者的启动、数据的传递都用到了 Intent,足以可见 Intent 在 Andorid 的重要性。Intent 这个英语单词的本意是“目的、意向、意图”。Intent 是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过 Intent,你的程序可以向 Android 表达某种请求或者意愿,Android 会根据意愿的内容选择适当的组件来响应。

目录

-显示

-隐示

-属性

-匹配规则

-PendingIntent

Intent 分为两种类型,分别为显示和隐示,下面将分别介绍

显示

显式 Intent,可以通过类名来找到相应的组件,在应用中用显式 Intent 去启动一个组件,通常是因为我们知道这个组件(Activity、Service)的名字。如下代码,我们知道具体的 Activity 的名字,要启动一个新的 Activity,下面就是用的显示 Intent。

Intent intent = new Intent(context,AActivity.class);
startActivity(intent);
  • 1
  • 2

隐示

隐式 Intent,不指定具体的组件,但是它会声明将要执行的操作,从而匹配到相应的组件。最简单的 Android 中调用系统拨号页面准备打电话的操作,就是隐式 Intent。

Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + "13888888888");
intent.setData(data);
startActivity(intent);
  • 1
  • 2
  • 3
  • 4

使用隐式 Intent 的时候,系统通过将 Intent 对象中的 IntentFilter 与组件在 AndroidManifest.xml 或者代码中动态声明的 IntentFilter 进行比较,从而找到要启动的相应组件。如果组件的 IntentFilter 与 Intent 中的 IntentFilter 正好匹配,系统就会启动该组件,并把 Intent 传递给它。如果有多个组件同时匹配到了,系统则会弹出一个选择框,让用户选择使用哪个应用去处理这个 Intent,比如有时候点击一个网页链接,会弹出多个应用,让用户选择用哪个浏览器去打开该链接,就是这种情况。隐式 Intent 启动固定 Activity。

AndroidManifest.xml 中注册

<activityandroid:name=".SecondActivity"><intent-filter><action android:name="com.madreain.intent.MY_ACTION"/><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

隐式 Intent 启动 Activity 代码

Intent intent = new Intent();
//设置动作(实际action属性就是一个字符串标记而已)
intent.setAction("com.madreain.intent.MY_ACTION");
tartActivity(intent);
  • 1
  • 2
  • 3
  • 4
  • 5

上面隐式 Intent 启动 Activity 提到了 action 属性,接下来来详细介绍一下 Intent 的相关属性

属性

component(组件)
目的组件的名称,这个只有显式 Intent 有,隐式 Intent 没有。例如:com.madreain.DemoActivity。该属性可以通过 setComonentName()、setClass()、setClassName()或者 Intent 的构造函数来设置。

action(动作)
用来表现意图的行动,这个可以用户自定义也可以使用系统中自带的 Action 值。例如:com.madreain.intent.MY_ACTION"该属性可以通过 setAction()方法或者 Intent 的构造函数来设置。

系统中常用的 Action 值:
ACTION_MAIN,标识 Activity 为一个程序的开始
ACTION_VIEW,当有一些信息需要展示出来
ACTION_SEND,发送邮件
Action_CALL,呼叫指定的电话号码
ACTION_DIAL,拨打电话
ACTION_EDIT,编辑某些文件
ALL_APPS,列出所有的应用
ACTION_ANSWER,处理呼入的电话

category(类别)
用来表现动作的类别,它是一个 ArraySet 类型的容器,所以可以向里面添加任意数量的补充信息,同时,Intent 没有设置这个属性不会影响解析组件信息。可以通过 addCategory()方法来设置该属性

常用的 Category 的值:

CATEGORY_LAUNCHER,应用启动的初始 Activity,这个 Activity 会被添加到系统启动 launcher 当中。
CATEGORY_BROWSABLE,设置 Category 为该值后,在网页上点击图片或链接时,系统会考虑将此目标 Activity 列入可选列表,供用户选择以打开图片或链接。
CATEGORY_APP_EMAIL,用来启动邮件应用程序

data(数据)
表示与动作要操纵的数据,它是待操作数据的引用 URI 或者数据 MIME 类型的 URI,它的值通常与 Intent 的 Action 有关联。实际应用打开指定网页

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
  • 1
  • 2
  • 3

type(数据类型)
对于 data 范例的描写,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。data和type属性一般只需要一个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,如果想要两个属性同时设置,要使用Intent.setDataAndType()方法

常用type类型:
intent.setType(“image/”);//选择照片
intent.setType(“audio/
”); //选择音频
intent.setType(“video/”); //选择视频 (mp4 3gp 是android支持的视频格式)
intent.setType(“video/
;image/*”);//同时选择视频和图片

extras(扩展信息)
扩展信息,以key-value键值对的形式来存储组件执行操作过程中需要的额外信息,可以调用putExtra()方法来设置该属性,这个方法接受两个参数,一个是key,一个是value。也可以通过实例化一个储存额外信息的Bundle对象,然后调用putExtras()方法将我们实例化的Bundle添加到Intent中。

Flags(标志位)
期望这个意图的运行模式,这个属性可以指示系统如何启动一个Activity,以及启动之后如何处理

补充:
Intent.createChooser():可用于启动网页强制每一次唤起选择框
接受隐式Intent:我们也可以设置我们可以接受的文件的type,然后隐式Intent能够匹配到任意一个过滤器就能被启动了

匹配规则

上面介绍了相关属性,我们知道当我们发送一个隐式Intent后,系统会将它与设备中的每一个组件的过滤器进行匹配,匹配属性有Action、Category、Data三个,需要这三个属性都匹配成功才能唤起相应的组件。接下来分别介绍Action、Category、Data的匹配规则

Action匹配规则

一个过滤器可以不声明Action属性也可以声明多个Action属性。隐式Intent中的Action属性,与组件中的某一个过滤器的Action能够匹配(如果一个过滤器声明了多个Action属性,只需要匹配其中一个就行),这样就算匹配成功。如果过滤器没有声明Action属性,那么只有没有设置Action属性的隐式Intent才能匹配成功。

Category匹配规则

一个过滤器可以不声明Category属性也可以声明多个Category属性。隐式Intent中声明的Category必须全部能够与某一个过滤器中的Category匹配才算匹配成功。比如说一个Category属性设为CATEGORY_BROWSABLE的隐式Intent也可以通过上面的过滤器,也就是说,过滤器的Category属性内容必须是大于或者等于隐式Intent的Category属性时候,隐式Intent才能匹配成功。如果一个隐式Intent没有设置Category属性,那么它可以通过任何一个过滤器的Category匹配。

Data匹配规则

一个过滤器可以不声明Data属性也可以声明多个Data属性。每个Data属性都可以指定数据的URI结构和数据MIME类型。URI包括scheme、host、port 和path四个部分,host和port合起来也成authority(host:port)部分。

PendingIntent

说到了Intent,我们就再来说说PendingIntent,PendingIntent是对Intent的一种封装。用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。

实例应用:Notification,SmsManager,AlarmManager等

Intent 与 IntentFilter 详解相关推荐

  1. Intent以及IntentFilter详解

    1. 前言 在Android中有四大组件,这些组件中有三个组件与Intent相关,可见Intent在Android整个生态中的地位高度.Intent是信息的载体,用它可以去请求组件做相应的操作,但是相 ...

  2. Android编程之Intent源码详解

    Intent源码详解,直接开始入题: Intent源码6700多行代码,但真正核心代码 就那么几百行,大部分都用来定义常量字符串了 先来看一下 public class Intent implemen ...

  3. Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED参数详解

    Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 参数详解 /*** If set, and this activity is either being starte ...

  4. android intent-filter作用,Android--Intent和IntentFilter详解

    Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势 1, Intent为组件的 ...

  5. Intent之Action详解

    Intent的中文意思是"意图,目的"的意思,可以理解为不同组件之间通信的"媒介"或者"信使". 目标组件一般要通过Intent来声明自己的 ...

  6. Android中的Intent和Intent-filter总结

    一.相关概念 (一)基本概念 Intent中文意思指"意图",按照Android的设计理念,Android使用Intent来封装程序的"调用意图",不管启动Ac ...

  7. android 拖动 点击事件,Android事件详解——拖放事件DragEvent

    1.Android拖放框架的作用? 利用Android的拖放框架,可以让用户用拖放手势把一个View中的数据移到当前layout内的另一个View中去. 2.拖放框架的内容? 1)拖放事件类 2)拖放 ...

  8. Android Intent机制详解

    什么是Intent  Intent 是一个将要执行的动作的抽象描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来启动一 ...

  9. Android应用开发—Intent组件详解

    转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...

  10. android intent例程,Android开发(四)| 探究活动(详解Intent+大量实例)

    在Android的开发项目中,Activity(活动)是最容易吸引到用户的地方,因为相比于算法.架构,它是实际可见的. Activity是一个可以包含用户界面的组件,主要用于和用户进行交互.一个用户程 ...

最新文章

  1. php静态页面缓存,php处理静态页面:页面设置缓存时间实例
  2. PHP中include和require
  3. Python爬取网站用户手机号_利用python爬取慕课网站上面课程
  4. 使用Visio进行UML建模
  5. input框自动填充内容背景颜色为黄色解决方法
  6. python底层源码_大师兄的Python机器学习笔记:统计学基础之底层代码实现(一)...
  7. 使用java创建kafka的生产者和消费者
  8. DeepFake技术--Deepfakes教程及各个换脸软件下载
  9. sl4a最新版下载_SL4A Script Launcherapp
  10. java反射之Method的invoke方法实现
  11. Spring-IoC注解
  12. 一、jsp和Servlet基础理论及jstl和EL表达式用法
  13. 51Talk-Level 7 Unit 1 L2
  14. HTCVIVE无线套装安装后unityvr项目无法在头盔中显示
  15. VC ++ 注册DLL
  16. centos修正时区
  17. Apache PHP 的gzip压缩输出的实现方法
  18. Python正则表达式re库
  19. Windows本地连接正常,上不去网的解决办法
  20. 【源码】粒子图像测速PIV简介及MATLAB工具箱PIVlab

热门文章

  1. Java/JSP中使用JDBC连接SQL Server 2005~(2008类似)
  2. 配置管理——配置项标识
  3. 杨格门锁 YGSLockSDK V3.3酒管软件接口_99v
  4. 10 个迅速提升你 Git 水平的提示
  5. 轻量级web富文本框——wangEditor使用手册(3)——如何自定义配置菜单 demo
  6. VMC to Hyper-V Import Tool 简体中文版.VZPEDIA首发
  7. SQL Server 2005新增加的功能
  8. 3.Prometheus 监控技术与实践 --- Exporter
  9. 36. LatencyTOP
  10. 86. php 绘图体系(2)