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



使用Intent启动组件的优势

1, Intent为组件的启动提供了一致的编程模型. 不管想要启动的组件是Activity, Service, 还是BroadcastReceiver, 都能够使用Intent封装启动的意图.

2, 在某些时候, 应用程序仅仅是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent能够方便的达到这样的高层次解耦的目的.



Intent的Component属性

Intent对象的setComponent(ComponentName comp)方法用于设置Intent的Component属性. ComponentName包括例如以下几个构造器:

ComponentName(String pkg, String cls)

ComponentName(Context pkg, String cls)

ComponentName(Context pkg, Class<?

> cls)

由以上的构造器可知, 创建一个ComponentName对象须要指定包名和类名--这就能够唯一确定一个组件类, 这样应用程序就可以依据给定的组件类去启动特定的组件. 比如:

ComponentName comp = new ComponentName(FirstActivity.this, SecondActivity.class);

Intent intent = new Intent();

intent.setComponent(comp);

以上三句代码创建了一个intent对象, 并为其指定了Component属性, 全然等价于以下的代码:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

除了使用setComponent() 之外, 还能够使用setClass(), setClassName()来显式指定目标组件, 还能够调用getComponent()方法获得Intent中封装的ComponentName对象.

当程序採用这样的形式启动组件时, 在Intent中明白的指定了待启动的组件类, 此时的Intent属于显式intent, 显式Intent应用场合比較狭窄, 多用于启动本应用中的component, 由于这样的方式须要提前获知目标组件类的全限定名. 而隐式Intent则通过Intent中的action, category, data属性指定目标组件须要满足的若干条件, 系统筛选出满足全部条件的component, 从中选择最合适的component或者由用户选择一个component作为目标组件启动.

假设Intent中指定了ComponentName属性, 则Intent的其它属性将被忽略.



Intent的Action属性

action属性是一个字符串, 代表某一种特定的动作. Intent类提前定义了一些action常量, 开发人员也能够自己定义action. 一般来说, 自己定义的action应该以application的包名作为前缀, 然后附加特定的大写字符串, 比如"cn.xing.upload.action.UPLOAD_COMPLETE"就是一个命名良好的action.

Intent类的setAction()方法用于设定action, getAction()方法能够获取Intent中封装的action.

下面是Intent类中提前定义的部分action:

ACTION_CALL--目标组件为activity, 代表拨号动作;

ACTION_EDIT--目标组件为activity, 代表向用户显示数据以供其编辑的动作;

ACTION_MAIN--目标组件为activity, 表示作为task中的初始activity启动;

ACTION_BATTERY_LOW--目标组件为broadcastReceiver, 提醒手机电量过低;

ACTION_SCREEN_ON--目标组件为broadcast, 表示开启屏幕.



Intent的Category属性

category属性也是一个字符串, 用于指定一些目标组件须要满足的额外条件. Intent对象中能够包括随意多个category属性. Intent类也提前定义了一些category常量, 开发人员也能够自己定义category属性.

Intent类的addCategory()方法为Intent加入Category属性, getCategories()方法用于获取Intent中封装的全部category.

下面是Intent类中提前定义的部分category:

CATEGORY_HOME--表示目标activity必须是一个显示home screen的activity;

CATEGORY_LAUNCHER--表示目标activity能够作为task栈中的初始activity, 常与ACTION_MAIN配合使用;

CATEGORY_GADGET--表示目标activity能够被作为还有一个activity的一部分嵌入.



Intent的Data属性

data属性指定所操作数据的URI. data常常与action配合使用, 假设action为ACTION_EDIT, data的值应该指明被编辑文档的URI; 假设

action为ACTION_CALL, data的值应该是一个以"tel:"开头并在其后附加号码的URI; 假设action为ACTION_VIEW, data的值应该是一个以"http: "开头并在其后附加网址的URI...

Intent类的setData()方法用于设置data属性, setType()方法用于设置data的MIME类型, setDataAndType()方法能够同一时候设定两者. 能够通过getData()方法获取data属性的值, 通过getType()方法获取data的MIME类型.



Intent的Extra属性

通过Intent启动一个component时, 常常须要携带一些额外的数据过去. 携带数据须要调用Intent的putExtra()方法, 该方法存在多个重载方法, 可用于携带基本数据类型及其数组, String类型及其数组, Serializable类型及其数组, Parcelable类型及其数组, Bundle类型等. Serializable和Parcelable类型代表一个可序列化的对象

, Bundle与Map类似,可用于存储键值对.



Intent的Flag属性

flag属性是一个int值, 用于通知android系统如何启动目标activity, 或者启动目标activity之后应该採取如何的兴许操作. 全部的flag都在Intent类中定义, 部分经常使用flag例如以下:

FLAG_ACTIVITY_NEW_TASK--通知系统将目标activity作为一个新task的初始activity;

FLAG_ACTIVITY_NO_HISTORY--通知系统不要将目标activity放入历史栈中;

FLAG_FROM_BACKGROUND--通知系统这个Intent来源于后台操作, 而非用户的直接选择...



IntentFilter类

IntentFilter类表示Intent过滤器, 大部分情况下, 每个component都会定义一个或多个IntentFilter, 用于表明其可处理的Intent. 

一般来说, component的IntentFilter应该在AndroidManifest.xml文件里定义. 

定义的方法: 在<activity>, <receiver>, <service>元素中添加一个或多个<intent-filter>子元素. 如:

<!-- 声明作为程序入口的Activity -->

<activity android:name=".FirstActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>



IntentFilter与隐式Intent

android系统处理隐式Intent时, 会比較Intent和IntentFilter的action, data, category属性, 假设以上3个属性全都相符的话, 则IntentFilter所属的component就能够作为目标组件的候选(存在多个符合条件的component时). 

1. 測试action属性. intent最多仅仅能定义1个action, 而filter能够定义1个或多个action. 

通过action測试的条件为: filter定义了intent的action. 比如intent的action为"android.intent.action.MAIN", 则定义了"android.intent.action.MAIN"这个action的filter都能通过action測试(当然, filter还能够包括很多其它额外的action).

假设filter未定义action, 则这个filter将堵塞全部intent. 假设intent未定义action, 那么仅仅要filter定义了action就能够通过action測试. 

2. 測试category属性. intent能够随意多个category, filter也能够随意个category. 通过category測试的条件为: filter定义了intent的全部category. 比如intent定义了"android.intent.category.DEFAULT"和"cn.xing.intent.category.UPLOAD"这2个category, 则定义了以上2个category属性的filter才干通过測试(当然, filter还能够包括很多其它额外的category).

依据上面的规则, 假设一个intent未定义category, 则全部filter都能够通过category測试. 可是有一种例外: 以startActivity(intent)方式启动一个activity时, 系统为会intent添加一个值为"android.intent.category.DEFAULT"的category, 这就意味着每个期望通过category測试的activity, 都要在其filter中定义"android.intent.category.DEFAULT"(除了作为程序入口的activity).

3. 測试data属性. intent最多仅仅能定义1个data, filter则能够定义多个data.

通过data測试的条件为:

a. 假设intent没有指定data和data type, 则仅仅有未定义data和date type的filter才干通过測试;

b. 假设intent定义了data未定义data type, 则仅仅有定义了同样data且未定义date type的filter才干通过測试;

c. 假设intent未定义data却定义了data type, 则仅仅有未定义data且定义了同样的data type的filter才干通过測试;

d. 假设intent既定义了data也定义了data type, 则仅仅有定义了同样的data和data type的filter才干通过測试.

data属性是一个URI, URI中包括scheme, host, post和path, 典型的URI为:

scheme://host:port/path

scheme, host, post和path都是可选的. 比較2个data时, 仅仅比較filter中包括的部分. 比方filter的一个data仅仅是指定了scheme部分, 则測试时仅仅是比較data的scheme部分, 仅仅要两者的scheme部分同样, 就视为"同样的data".


Intent及IntentFilter具体解释的更多相关文章

  1. Android的Intent和IntentFilter应用说明一例

    很多人对文档中的Intent和IntentFilter不理解是什么意思,我这里举例解释下. Intent字面意思就是目标,目的.通俗一点,需要达成某些目标,则需要提供一些动作,这些目标的分类,以及达成 ...

  2. Intent和IntentFilter详解

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

  3. [转]android笔记--Intent和IntentFilter详解

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

  4. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  5. Android应用程序组件之间的通信Intent和IntentFilter

    Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...

  6. Intent和IntentFilter简介

    Intent和IntentFilter简介 Intent和IntentFilter简介 意图Intent分类: 显式意图:利用class找到对方,在同一个应用程序类可以方便使用,但是在不同的应用程序无 ...

  7. android笔记--Intent和IntentFilter详解

    本文转载自:https://www.cnblogs.com/liushengjie/archive/2012/08/30/2663066.html 本文转载自:https://www.cnblogs. ...

  8. Android开发之隐式Intent中Intent-filter的三个属性-action,category,data

    使用隐式Intent时,需要使用到意图过滤器Intent-filter.Intent-filter含有三个属性:action,category,data.通过这三个属性的组合,可以启动想要启动的act ...

  9. intent和intentfilter

    intent 和intent Filters startActivity()的机制 用到了IBinder ipc 用到了进程间通讯机制 activity有四种LaunchMode 当startActi ...

随机推荐

  1. vue初级学习--路由router的编写(resolve的使用)

    一.导语 最近在用vue仿写淘宝的商品详情页面以及加入购物车页面,若是成功了,分享给大家~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二.正文 我先用控制台创建了vue项目demo(如 ...

  2. Luogu P1541 乌龟棋(NOIP2010TG)

    自己的第一篇博文 祭一下祭一下 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点, ...

  3. [eclipse相关] eclipse 安装svn插件

    最近看到别人带主题的eclipse,非常羡慕,所以也换了一个eclipse,版本是java ee luna 4.4.2,然后得偿所愿有了花花绿绿的代码界面:) 但是差点被svn搞死,~~~~(> ...

  4. 你有什么理由还不选择阿里云服务器呢--从阿里云发布自研商用关系型数据库POLARDB想到的

    最近几天,阿里云发布自研商用关系型数据库POLARDB的消息可谓是重磅炸弹啊.借用官方宣传的话就是:6倍性能于MySQL并100%兼容/100TB存储容量/2分钟创建只读副本/3分钟创建容灾实例,第三 ...

  5. c#异步调用的几种方式

    首先,我们分析一下异步处理的环境 需要在当前线程中获取返回值 不需要在当前线程中获取返回值,但是仍然需要对返回值做处理对于第1中情况,还可以继续细分 在当前线程中启动线程T,然后继续执行当前线程中的其 ...

  6. AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告(上篇)

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 张钦坤 腾讯研究院秘书长蔡雄山 腾讯研究院法律研究中心副主任祝林华 腾讯研究院法律研究中心助理研究员曹建峰 腾讯研究院法律研究中心高级研究员 ...

  7. YII2 models非常好用的控制输出数据【重写Fields】

    models里重写Fields真的很好用,用于分类.评论功能 列子:评论表models/Comment.php 1.关联商品表 2.获取父级(即管理员)评论 public function Field ...

  8. SQL Server 初识游标

    ---恢复内容开始--- 游标:游标是一种能从包含多个数据的结果集每次提取一条的机制 游标的特点是: 检索得到的数据集更加灵活 可有针对性的对数据进行操作 拥有对数据进行删除和更新的能力 为何使用游标 ...

  9. SpringCloud接入EDAS——服务发现篇

    旁白 很久没有写技术文章了,最近不是写水文就是写小说.说到底,还是最近很少研究技术的缘故,已经到了江郎才尽的地步了. 不过,LZ无意间看到自己团队的小伙伴写的一些文章,觉得还是不错的,于是便动了心思, ...

  10. TFboy养成记 简单小程序(Variable & placeholder)

    学习参考周莫烦的视频. Variable:主要是用于训练变量之类的.比如我们经常使用的网络权重,偏置. 值得注意的是Variable在声明是必须赋予初始值.在训练过程中该值很可能会进行不断的加减操作变 ...