隐式意图匹配规则

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器.即Android的四大组件中活动、服务和广播接收器、内容提供者中只有内容提供者不是被Intent激活的.
Intent可以划分成显式意图和隐式意图。
显示意图适合用于应用的内部,速度较快.
隐式意图有对应的查找规则,所以速度会相对慢点.更适合应用于应用之间激活组件!!

显式意图:
显式意图明确指定了Intent应该传递给哪个组件
如调用Intent.setComponent(),Intent.setClassName(),Intent.setClass()方法明确指定了组件
隐式意图:没有明确指定组件名的Intent为隐式意图.
Android系统会根据隐式意图中设置的动作(action),类别(category),数据(URI(包含scheme,host,path,port等)和数据类型(mimeType))找到最合适的组件来处理这个意图.
Android系统数据是通过Uri体现的

如果Activity的意图过滤器和想激活此Activity的意图对象都没有设置数据的情况下,意图对象中的动作(action)名称和类别必须与Activity的过滤器的动作(action)名称和类别相匹配.
所以问题来了:
某Activity中的意图过滤器只定义了action
<activity android:name=".OtherActivity">
  <intent-filter>
	<action android:name="cn.sohu.laoli"/>
  </intent-filter>
</activity>
于是我们常常这么做去激活此Activity:
Intent intent = new Intent();
intent.setAction("cn.sohu.laoli");
startActivity(intent);
但是这么做是错误的,系统会提示错误:找不到对应组件
因为当我们的Intent只设置动作,没有设置类别的时候,在执行intent.setAction("cn.sohu.laoli");时这个方法内部会为Intent设置一个默认的Intent类别
即为android.intent.category.DEFAULT.于是这个Intent实际上就设置了动作(action)和类别(category).于是无法匹配此处Activity的意图过滤器.
为了匹配需要给此处Activity的意图过滤器加上一个Intent默认的类别.
<activity android:name=".OtherActivity">
  <intent-filter>
	<action android:name="cn.sohu.laoli"/>
        <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter>
</activity>

总结:在Intent和Activity中的意图过滤器同样没有设置数据的情况下,只要Intent对象中的动作(action)和类别(category)是Activity中的意图过滤器的动作(action)和类别(category)的子集即可.因为有的情况下Activity中的意图过滤器会定义多个动作(action)和类别(category)

意图过滤器的设置:
<activity android:name=".OtherActivity">
    <intent-filter>
	<action android:name="cn.sohu.laoli"/>
	<category android:name="android.intent.category.laozhang"/>
	<data android:scheme="sh" android:host="www.sohu.cn" android:path="/person"/>
	<data android:mimeType="image/gif"/>
   </intent-filter>
</activity>
在此意图过滤器中设置了数据的两个方面:URI(包含scheme,host,path,port等)和数据类型(mimeType)
于是这样设置Intent来匹配意图过滤器:
Intent intent = new Intent();
intent.setAction("cn.sohu.laoli");
intent.setDataAndType(Uri.parse("sh://www.sohu.cn/person"), "image/gif");
注意:
1 不能把数据和类型分开设置.即setType(),setDate()!!!!!!!因为setType()会清除掉setDate()所进行的设置!!!!!
  而要同时设置数据和类型方法即setDataAndType()
2 如果Intent和Activity中的意图过滤器中的一方设置了数据而另一方没有设置,那么此时是不可能匹配的

 

时间: 2024-10-21 22:51:25

隐式意图匹配规则的相关文章

Android开发21——隐式意图

所谓隐式意图就是在意图激活Activity.Service或BroadcastReceiver这三类组件时,并不显示指出需要显示指出主键的名字,而是通过指定action,data,category,Android系统会根据这三个特征找到最合适的组件并激活.先看自定义的例子 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity an

Android学习之Intent中显示意图和隐式意图的用法实例分析_Android

本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用. 因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦. 例如,在一个联系人

android隐式意图激活浏览器的实现方法

在有些时候,我们可能想打开某个不确定的应用,比如,我们想要通过浏览器打开百度的站点,但是我们并不强调必须要使用哪一个浏览器,那么这种情况我们使用显示意图可能不太好,更好的做法是使用隐式意图打开网站. 效果: 点击按钮后: 附代码: package com.yy.activity; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle;

android隐式意图激活自定义界面和系统应用界面的实例

我们也可以使用隐士意图激活自定义的界面,并且可以携带数据: 效果: 点击第二个按钮后: 点击最后一个按钮(激活系统短消息界面)后: 附代码: 主窗体的代码: package com.yy.twoactivity; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; public

MySQL隐式类型的转换陷阱和规则_Mysql

前言 相信大家都知道隐式类型转换有无法命中索引的风险,在高并发.大数据量的情况下,命不中索引带来的后果非常严重.将数据库拖死,继而整个系统崩溃,对于大规模系统损失惨重.所以下面通过本文来好好学习下MySQL隐式类型的转换陷阱和规则. 1. 隐式类型转换实例 今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值) SELECT f_col3_id,f_qq1_id FROM d_dbname.t_tb1 WHERE f_col1_id=

Android中的意图匹配:IntentFilter的作用

[0]Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提 供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件.使 用Intent可以激活Android应用的三个核心组件:活动.服务和广播接收器. [1]Intent可以划分成 显式意图和隐式意图. 显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了 组件名的Intent为显式意图

Android中的Intent Filter匹配规则简介_Android

本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家:  ) 1. Intent简介 Intent用于在一个组件(Component,如Activity.Service.Broadcast Receiver)中打开另一个组件. Intent可分为隐式(implicitly)和显式(explicitly)两种: Explicitly Intent:在知道要打开哪个具体的Component时使用,通过指定调用者和被调用者即可打开目标Component

Android中的Intent Filter匹配规则简介

本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家:  ) 1. Intent简介 Intent用于在一个组件(Component,如Activity.Service.Broadcast Receiver)中打开另一个组件. Intent可分为隐式(implicitly)和显式(explicitly)两种: Explicitly Intent:在知道要打开哪个具体的Component时使用,通过指定调用者和被调用者即可打开目标Component

MySQL隐式转化整理

前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下.希望对大家有所帮助. 当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion).比如下面的例子: mysql> SELECT 1+'1'; -> 2 mysql> SELECT CONCAT(2,' test'); -&