匿名性质的运行时绑定使得理解Android如何解析一个隐式Intent到一个特定的应用程序组件变得重要。

和你之前看到的一样,当使用startActivity时,隐式Intent解析到一个单一的Activity。如果存在多个Activity都有能力在特定的数据上执行给定的动作的话,Android会从这些中选择最好的进行启动。

决定哪个Activity来运行的过程称为Intent解析。Intent解析的目的是通过下面的过程找到可能匹配得最好的Intent Filter

1.Android把安装的包中可获得的Intent Filter放到一个列表中。

2. 动作和与正在解析的Intent的种类不关联的Intent Filter会从列表中删除。

2.1. 动作匹配指Intent Filter包含特定的动作或没有指定的动作。一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。

2.2. 种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。

3. 最后,Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义schemehost/authoritypathmimetype,这些值都会与IntentURI比较。任何不匹配都会导致Intent Filter从列表中删除。

没有指定data值的Intent Filter会和所有的Intent数据匹配。

3.1.mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。

3.2.schemeURI部分的协议——例如,http:mailto:tel:

3.3.host-name或“data authority”是介于URIschemepath之间的部分(例如,www.google.com)。匹配主机名时,Intent Filterscheme也必须通过匹配。

3.4. 数据path是紧接在“data authority”的后面(例如,/ig)。path只在schemehost-name部分都匹配的情况下才匹配。

4. 如果这个过程中多于一个组件解析出来的话,它们会以优先度来排序,可以在Intent Filter的节点里添加一个可选的标签。最高等级的组件会返回。

Android本地的应用程序组件和第三方应用程序一样,都是Intent解析过程中的一部分。它们没有更高的优先度,可以被新的Activity完全的代替,这些新的Activity宣告自己的Intent Filter能响应相同的动作请求。

更多相关文章

  1. Android(安卓)LayoutInflater inflate方法效率
  2. Android(安卓)本地广播动作
  3. eclipse adb 启动失败,无法匹配android设备 的解决方案
  4. Android(安卓)APK包文件解析
  5. Android中Notification的framework层讲解【安卓源码解析四】
  6. Android(安卓)之 ContentProvider的简介-相关类的介绍
  7. Android、JUnit深入浅出(一)——JUnit初步解析
  8. Android之JSON格式数据解析
  9. Android常见的存储方式

随机推荐

  1. BootStrap3.0学习--JavaScript 插件
  2. 关于洗牌算法的错误认识
  3. Javascript知识汇总------面向对象中继承
  4. 在关联数组中移动元素[重复]
  5. 对JavaScript优化及规范的一些感想
  6. 键盘出现时,UIWebView滚动。导致点击偏移
  7. 我如何捕获并插入Meteor.Error警报从Mete
  8. JavaScript 实现GridView汇总
  9. 如何使用try,catch在错误处理中打印消息
  10. javascript之DOM技术(二)