意图是Android用来发现识别Activity、Service、Receiver的机制,它在某些方面与Linux shell的搜索路径比较相似。利用搜索路径,shell在多个可能的目录中进行搜索,寻找与传给它的命令名相匹配的可执行文件。意图在清单列表中,通过<intent-filter>标签进行声明。主要分为两种:显式意图和隐式意图。
显式意图
显式意图直接指定一个准确的应用程序组件,相当于在Linux shell中给一条指令提供一条绝对路径。对于显式意图,最重要的是两个用来命名组件的字符串:目标应用程序的包名,以及组件的类名。例如:包名为com.example.email,类名为com.example.email.MailMainActivity。包管理通过包名返回应用程序需要的任何信息,如源码位置等。通过类名,可以得知需要 执行的是哪部分源码。
隐式意图
隐式意图(implict intent)描述所需组件的特点,而不直接指向该组件。这相当于在Linux shell中,给shell提供一条指令名,随后shell使用搜索路径来寻找一条待运行的具体指令。这个寻找与隐式意图相匹配的组件的过程叫意图解析。
意图解析有三种可能的结果:
(1)没有找到匹配的活动;
(2)仅找到一个匹配的活动;
(3)找到了多个能够出来该意图的活动。
空的匹配会导致空的结果或者一个异常,这取决于调用者在该处的期望返回类型。如果仅有一个匹配结果,系统会立即执行这个意图,此时它已转为显式意图。如果有多个匹配结果,则需要寻找其它解析方法使得结果唯一。
如果一个意图被解析为多个可能的活动,则不能同时执行它们,而是需要挑选一个执行。包管理器将这个意图解析为搭建在系统中的名为ResolverActivity的特殊活动,要求用户选择其中一个。做出选择后,它根据原意图和用户选择的活动创建一个新的显式意图,通知系统运行该活动。
参考文献:
[1] 现代操作系统
网友评论