Android系统的过滤机制大揭(一)
——Android将军的Android自修之途
Android系统通过一些列过滤机制(Action、Category和Data)调用指定的应用程序组件。
过滤条件的设置:
窗口过滤条件首先需要从调用者和被调用者两方面考虑:
(1)调用者:调用者就是通过Action调用其他程序中窗口的一端。在这一端需要使用Intent的相应方法设置Action、Category和Data,也就是设置调用的窗口要满足的过滤条件。Action和Data只能指定一个(分别通过setAction和setData方法设置),而Category可以指定多个(通过addCategory方法设置)。设置完过滤条件后,通常会使用Activity.startActivity方法显示满足条件的窗口。
(2)被调用者:被调用者就是如何声明被调用的窗口。在声明一个窗口类时可以不指定过滤器,也可以指定多个过滤器,每一个过滤器用<intent-filter>标签设置。
过滤器的筛选规则:
窗口类的每一个过滤器(<intent-filter>标签)都会在系统中注册,然后系统再根据Intent对象设置的过滤条件筛选符合条件的窗口时会逐一扫描这些过滤器,并会分别根据Action、Category和Data 筛选出所有符合条件的过滤器,如果这些被筛选出的过滤器属于多个窗口,系统就会显示一个选择列表,如果只属于一个窗口,就直接显示窗口。
筛选规则主要应从两方面考虑。
(1)首先应考虑Action、Category和Data在默认情况下代表什么含义。也就是在不设置这3个过滤条件的情况下,系统会如何处理。
1、不设置Action。由于Action是必选项,所以必须要设置Action,否则该窗口无法被其他的Android应用调用(同一个android应用还是可以通过显示方式调用的)。
2、不设置Category。系统会添加一个默认的Category(android.intent.category.DEFAULT)。
3、不设置Data。系统会认为目标窗口不含有任何Data,也就是说如果不为Intent对象指定Data,在声明目标窗口时也不能在过滤器中使用<data>标签。否则即使Action和Category都匹配该过滤器也不符合条件。
(2)要考虑的第二个方面是Action、Category和Data如何进行匹配。系统会分别进行3次验证(分别验证这3个过滤条件),只有这3次验证都通过的过滤器才符合要求(该过滤器对应的窗口会成为候选窗口之一)。
三个过滤条件的验证规则:
1、Action验证:
如果某个过滤器指定了一个或多个<action>标签(如果没有<action>标签或Intent对象未设置Action,Action验证肯定失败)。系统会扫描所有的<action>标签,如果找到与指定Action相同的<action>标签,就认为Action验证通过。
2、Category验证:
Category验证采用了子集的方法,也就是说为Intent对象指定了N个Category,而在某一个过滤器中设置了M个Category,并且M>=N。那么如果N个Category是M个Category的子集,那么该过滤器通过Category验证。否则不管是 M<N,还是其他任何情况,Category验证都失败。