Intent                                                                                      

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,

Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。

使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。

显式意图                                                                                     

调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

Intent intent = new Intent();
intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));

或者

intent.setClass(MainActivity.this, OtherActivity.class);

或者

Intent intent = new Intent(MainActivity.this, OtherActivity.class)

隐式意图                                                                                    

没有明确指定组件名的Intent为隐式意图。

Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图,比如:

Uri uri = Uri.parse("tel:" + phoneCode);
Intent intent = new Intent(Intent.ACTION_CALL, uri);

对于隐式意图,通过指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

ACTION

一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:

  • 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
<intent-filter>
</intent-filter>

  • 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

Category

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。

原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。
但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。

因此自定义 Activity 的时候,不要以为光定义一个 action 就够了。这样用 startActivity() 来激活这个 Activity 的时候将一直报错。

原因就是,他内部要求去匹配 android.intent.category.DEFAULT 这个类别。

因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。
(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

Data

当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。
例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;

如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;

如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。

当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:

  • 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。
  • 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。
    这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。
  • 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。
  • 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。

如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。

换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。

我是天王盖地虎的分割线                                                                 

写的一个关于隐式意图的demo

源代码:http://pan.baidu.com/s/1dD1Qx01

intent学习.zip

本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3801362.html,如需转载请自行联系原作者

Android -- Intent相关推荐

  1. Android Intent setAction的使用注意

    Action 的作用: 设置要执行的常规操作,一般在界面的隐式跳转(跳转到拨打电话界面等操作),服务,广播, Action用在隐式跳转使用 java 代码 Intent intent = new In ...

  2. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

  3. android之android.intent.category.DEFAULT的用途和使用

    1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity , ...

  4. (转)理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER

    其中Android.intent.action.MAIN 与 android.intent.category.LAUNCHER 决定应用程序在luncher中的显示方式: 两者的作用如下: andro ...

  5. 监听屏幕 android.intent.action.USER_PRESENT

    在做解锁监听程序时,一开始采用监听屏幕SCREEN_ON和SCREEN_OFF这两个action. 但奇怪的是,这两个action只能通过代码动态的形式注册,才能被监听到,使用AndroidManif ...

  6. Android Intent 大全[转载]

    Android Intent 大全     android 中intent是经常要用到的.不管是页面牵转,还是传递数据,或是调用外部程序,系统功能都要用到intent.         ★intent ...

  7. 【错误记录】Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Android 应用安装后 , 出现两个相同的启动图标 , 其中一个可以启动 , 另外一个启动后 , 直接崩溃 ; 卸载其中一个 , 会将整个应用卸 ...

  8. Android——Intent动作汇总(转)

    String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. "android.intent.action.ADD_SHORTCUT"  String ...

  9. Android --- android.intent.action.MAIN 与 android.intent.category.LAUNCHER常用的几种情况

    第一种情况: 有MAIN,无LAUNCHER,程序列表中无图标 原因:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 第二种情况: 无MAIN,有LA ...

最新文章

  1. VLFeat开源库介绍及在VS2013中的编译
  2. pandas中使用rolling.corr函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)、例如,计算两种商品销售额之间的3个月的滚动相关性
  3. asp.net中防止攻击的方法
  4. 要嫁就嫁程序员!原因很简单:五成表示工资愿交给另一半!
  5. echarts 3d地球 背面光线太暗_新技术:多波长光源,同时3D打印多种光敏树脂材料...
  6. CMMI认证适用的企业
  7. 计算机一级B考试总结500字,期中考试总结与反思500
  8. unity自己遇到的一些bug与解决方法的记录
  9. 小米忙着营销,麻烦带上技术!
  10. 铺地毯(NOIP真题)
  11. mysql dbcp 配置文件_数据库连接池DBCP使用方式
  12. php页面导出csv,使用PHP生成并导出CSV文件
  13. 使用Socks5代理加速爬虫访问的方法
  14. JAVA设计模式之概述
  15. 华为交换机关闭服务端口
  16. LED驱动IC TM1616,TM1650,TM1651替代兼容型号(VK,AIP)
  17. react通过hook实现父组件调用孙子组件方法(非redux)
  18. 个人作业——A002-185-2513-吴光华
  19. c语言课程设计 学生成绩管理系统
  20. APP Invertor 蓝牙BLE 个人案例分享 快速开发自己的蓝牙APP

热门文章

  1. DeepMind网红博士300页论文出炉:面向NLP的神经迁移学习
  2. 地平线:全球估值第一的AI芯片初创公司诞生!
  3. 北欧小国的宏大AI实验:让1%的人口接受人工智能培训
  4. 人工智能时代的“认知劳动”
  5. Python 之 Pandas (三)选择数据
  6. 盘点|应用落地,构建城市“大脑”
  7. 玩电子游戏的神经网络,告诉我们大脑是如何决策的
  8. NATURE 人工智能 | 神奇的粒子机器人
  9. 最后一场「屏之争」:汽车大佬与硅谷巨头的贴身肉搏
  10. 清华自动驾驶前沿报告!解密六大关键技术,全球人才分布【附下载】| 智东西内参...