本文主要详细介绍Android中的意图过滤匹配规则。感兴趣的朋友可以参考一下。
本文主要介绍隐式意图匹配目标组件的规则。如有不清楚或不准确的表述,望各位指出。谢谢:)
1. Intent简介
意图用于打开一个组件中的另一个组件(如活动、服务、广播接收器)。
意图可以分为两种类型:隐式和显式:
显式意图:在知道要打开哪个特定组件时使用,通过指定调用者和被调用者可以打开目标组件;
隐式意图:在不知道要打开哪个组件的情况下,系统会通过指出动作、数据和类别来找到匹配的组件。
(1)Explicitly Intent
当你确切地知道你要打开哪个组件时,它就是你的菜了。通常这样用:
Intent intent=new Intent(this,main activity . class);
intent.putExtra('key ',' value ');
startActivity(意图);
执行上面的代码会导致目标组件(这里是MainActivity)被创建(调用onCreate等一系列生命周期方法)。在MainAcitivity中相应的生命周期方法中,可以通过getIntent.getXxxExtra("key ")来获得与Intent一起传递的数据。
(2)Implicitly Intent
隐式意图很好地实现了调用者和被调用者之间的解耦:
调用方通过动作、数据、类别三个方面描述自己的意图,被调用方通过清单文件中声明的一系列意图过滤器描述自己可以响应哪些意图。这样,通过隐含的意图,呼叫者和被呼叫者可以在彼此不了解的情况下很好地合作。
更详细的意向介绍,可以参考官方文档。这里主要介绍隐式意图的匹配规则。
2.Intent Filter匹配规则
只有动作、数据、类别匹配,才认为意图匹配成功,然后才能打开相应的组件。如果一个组件声明了多个intentfilters,它只需要匹配任何一个就可以启动该组件。
(1)action的匹配规则
可以在一个意图过滤器中声明多个动作,意图中的动作与其中任何一个字符串形式的动作完全相同(注意是区分大小写的),所以动作匹配成功。可以通过setAction方法为Intent设置操作,也可以在构造Intent时传入操作。请注意,隐含的意图必须指定行动。例如,我们在清单文件中为MyActivity定义了以下意图过滤器:
意图过滤器
action Android:name=' Android . intent . action . send '/
action Android:name=' Android . intent . action . send _ TO '/
/意图-过滤器
那么只要意图的动作是“SEND”或“SEND_TO”,这个意图就可以在动作上成功匹配上述活动。例如,我们的意图定义如下:
意向意向=新意向(' android.intent.action.SEND ')
.
然后我们的意图和我的行动相匹配。
Android中预定义了很多动作,这些动作代表了一些常见的操作。常见操作如下(Intent类中的常量):
意图。动作_视图
意图。行动_拨号
意图。ACTION_SENDTO
意图。动作_发送
意图。动作_网页_搜索
(2)data的匹配规则
数据可以进一步分为uri(由scheme、host、port、path | pathPattern | pathPrefix组成)和mimetype。Intent的uri可以用setData方法设置,mimetype可以用setType方法设置。隐含意图还必须指定数据。与action类似,只要意图的数据与意图过滤器中的任何数据声明完全相同,数据方面就匹配成功。注意:如果意图过滤器的数据声明部分没有指定uri,则默认uri为内容或文件,意图中uri的scheme部分需要为内容或文件才能匹配;若要为Intent指定完整的数据,必须使用setDataAndType方法。请参阅setData和setType方法的源代码,原因如下:
公共意图setData(Uri数据){
mData=数据;
mType=null
还这个;
}
公共意图设置类型(字符串类型){
mData=null
mType=类型;
还这个;
}
从上面的代码可以看出,setData会将mimeType设置为null,setType会将uri设置为null。我们举个例子来说明数据的匹配。首先,让我们看看在意图过滤器中指定数据的语法:
data android:scheme='."
android:host=' . '
android:port=' . '
android:path=' . '
android:pathPattern=' . '
android:pathPrefix=' . '
android:mimeType=' . '/
方案、主机和其他部分不需要全部指定。假设我们为MyActivity的意图过滤器指定了以下数据:
意图过滤器
data Android:mime type=' vidoe/mpeg ' Android:scheme=' http ' Android:host=' www . XXX . com '/
data Android:mime type=' text/plain ' Android:scheme=' http '/
/意图-过滤器
然后我们的意图想要匹配,mimeType可以是“text/plain”或者“video/mpeg”,方案必须是“http”,主机不限,因为第二个数据没有指定主机。
(3)category的匹配规则
与操作和数据不同,意图中的类别必须全部出现在意图过滤器中才能成功匹配。意图不需要指定类别。如果Intent中没有指定category,系统会自动为其添加“Android . Intent . category . default”。因此,所有想要接收隐式意图的组件必须在清单文件的意图过滤器声明中包含“Android . Intent . category . default”。我们可以通过addCategory方法为Intent添加一个类别。
(4)查询是否有可接收指定Intent的Component
采用PackageManager的resolveActivity或Intent的resolveActivity方法将获得最合适的活动;为了意图;调用PackageManager的queryIntentActivities将返回所有成功匹配意图的活动。这些方法的详细定义请参考官方文档,这里就不赘述了。
这就是本文的全部内容,希望对大家的学习有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。