Intent和Intent Filter

来源:互联网 发布:阿里巴巴的云计算 编辑:程序博客网 时间:2024/04/28 11:54

1、构建Intent

Intent中包含的信息主要如下:

(1)要启动的组件名称

这是可选项,但这也是构建显示Intent的一项重要信息,这意味着Intent应当仅传递给由组件名称定义的应用组件。如果没有组件名称,则Intent是隐式的,且系统根据其他的Intent信息决定哪个组件应当接收Intent,因此,如需在应用中启动特定的组件,则应当制定组件的名称。

注意:启动Service时,你应该始终指定组件名称,否则你不确定哪个服务将会响应Intent,且用户无法看到哪项服务已启动。

(2)Action:指定要执行的操作的字符串

(3)Data:引用待操作数据或该数据MIME类型的URI。提供的数据类型通常由Intent的Action决定。创建Intent时,除了指定的URI,指定数据类型(MIME类型)往往也很重要,例如,能够显示图像的Activity可能无法播放音频文件,即便URI格式非常类似也是如此。因此,指定数据的MIME类型有助于系统找到接收Intent的最佳组件。要仅设置数据URI,可以使用setData(),要仅设置MIME类型,请调用setType(),两个都要设置调用setDataAndType(),但不能同时调用setData()和setType(),因为他们会抵消相互的值。

(4)category

(5)Extra

(6)Flag


2、强制使用选择器

如果有多个应用响应隐式选择器,则用户可以选择要使用的应用,并将其设置为该操作的默认选项,但是,如果用户希望每次使用不同的应用,则应采用显式方式显示选择器对话框。要显示选择器对话框,请使用createChooser()并传递给startActivity()。

Intent sendIntent = new Intent(Intent.ACTION_SEND);...// Always use string resources for UI text.// This says something like "Share this photo with"String title = getResources().getString(R.string.chooser_title);// Create intent to show the chooser dialogIntent chooser = Intent.createChooser(sendIntent, title);// Verify the original intent will resolve to at least one activityif (sendIntent.resolveActivity(getPackageManager()) != null) {    startActivity(chooser);}


3、接收隐式Intent

为了接收隐式Intent,必须将CATEGORY_DEFAULT定义在intent-filter中


4、使用PendingIntent

PendingIntent对象是Intent对象的包装器,PendingIntent的主要目的是授权外部应用使用包含的Intent,就像他从你的应用本身的进程执行一样。

PendingIntent的主要用例包括:

(1)声明用户使用你的通知执行操作时要执行的Intent(Android系统的NotificationManager执行Intent)。

(2)声明用户使用你的应用小工具操作时要执行的Intent(主屏幕应用执行Intent)

(3)声明未来某一特定时间要执行的Intent(AlarmManager执行Intent)

由于每个Intent对象均设计为由特定类型的应用组件进行处理,因此还必须基于相同的考虑因素创建PendingIntent,使用PendingIntent时,应用不会使用调用执行该Intent,相反,通过调用相应的创建器方法创建PendingIntent时,你必须声明所需的组件类型

(1)PendingIntent.getActivity()

(2)PendingIntent.getService()

(3)PendingIntent.getBroadcast()

除非你的应用正在从其他应用中接收PendingIntent,否则上述用于创建PendingIntent的方法可能是你唯一需要的PendingIntent方法。

每个方法均会提取当前应用的Context,你要包装的Intent以及flag


5、Intent解析

当系统接收到隐式Intent以启动Activity时,他根据以下三个方面将Intent与Intent filter进行比较,以搜索该Intent的最佳Activity

(1)Intent action

要通过action检验,必须与Intent Filter中列出的Action的某一项匹配。如果该Intent Filter未列出任何aciton,则所有Intent都无法通过,但是如果Intent未指定action,则会通过检验。

(2)Intent category

若要Intent通过category检验,则Intent的每个category都必须与Intent Filter匹配,反之则未必。不含category的Intent始终能通过检验

注意:Android会自动将CATEGORY_DEFAULT的category传递给startActivity()和startForResultActivity()的所有隐式Intent,因此,如果需要接收隐式Intent必须要在Intent Filter加入该category

(3)Intent data

每个<data>元素都可以都可指定URI结构和数据结构(MIME类型)。URI的每个部分均包含单独的scheme、host、port和path属性。

例如content://com.example.project:200/floder/subfolder/etc

在此URI中,架构是content,主机是com.example.project,端口是200,路径是floder/subfolder/etc


如果未指定scheme,则会忽略host

如果未指定host,则会忽略port

如果未指定scheme和host,则会忽略path


将Intent中的URI与Intent Filter中的URI进行比较时,他仅与Intent Filter中包含的部分URI进行比较。例如:

如果过滤器仅指定架构,则具有该架构的所有URI均与该过滤器匹配

如果过滤器仅指定架构和和权限,但没指定路径,则具有相同架构和权限的所有URI都会通过过滤器

如果过滤器指定了架构权限和路径,则只有都符合的情况下URI才会通过过滤器

注意:路径规范可以包含通配符(*)

data检验会将Intent中的URI和MIME类型进行比较,规则如下

(1)仅当过滤器未包含任何URI或MIME类型时,不含URI和MIME类型的Intent才能通过

(2)对于包含URI、但不包含MIME的Intent,仅当其URI部分匹配并且也未指定MIME类型时才会通过

(3)仅当过滤器列出相同的MIME类型时,包含MIME类型确不包含URI的Intent才会通过

(4)仅当MIME类型与过滤器列出的类型匹配时,包含URI和MIME类型的Intent才会通过MIME类型部分的检验,如果Intent URI与过滤器的URI匹配,或者如果Intent具有content:或者file;且过滤器没有指定URI,则Intent才会通过测试的URI部分。换言之,如果过滤器仅列出MIME类型,则假定组件支持content:和file:。


6、Intent匹配:

你的应用可以采用类似的方法使用Intent匹配,PackageManager提供了一整套query()方法来返回所有能有接收特定Intent的组件。此外,他还提供了resolver()方法来确定响应Intent的最佳组件。例如,queryIntentActivities()将返回那些作为参数传递的Intent的所有Activity列表,对于广播接收器,有类似的方法。




0 0
原创粉丝点击