Intent根据是否明确启动的组件可以分为两类:显示意图、隐式意图。
· 显示意图:显示意图通过指定组件的完全限定类名来指定待开启的组件。它通常用来开启一个与当前组件相同应用程序中的其它组件,因此它必须要明确知道待开启组件的完全限定类名。开启的组件在程序的编译期就已经被明确了。例如:在某个Activity中,通过指定当前应用下的某个Service来下载一个MP3文件。
· 隐式意图:隐式意图并不明确指定待开启的组件,而是通过指定特定的行为,来允许某个组件来对其进行处理。也就是说,在程序的编译期,并无法确定这个Intent的行为,会被哪个组件来处理,所以它所能启动的组件,并不仅限于当前应用下的组件,而是整个系统中提供了相应意图过滤器的所有组件。
当使用显示意图开启一个组件时,系统会立即通过Intent中指定的组件类,来启动相应的组件。而如果使用的是隐式意图,系统会通过Intent中指定的行为,在系统中比较所有组件在清单文件AndroidManifest.xml中配置的意图过滤器,来选定待开启的组件。如果当前Intent指定的行为在当前系统中,通过意图过滤器有唯一的匹配组件,那么立即启动该组件,如果当前Intent指定的行为在当前系统中,通过意图过滤器具有多个匹配组件,那么将显示一个对话框,由用户选择使用哪个组件来进行处理。
上图描述了一个简单的使用隐式意图开启另外一个应用程序中某个Activity组件的逻辑。首先,Activity创建了一个Intent对象,在其中描述了一个行为,并且调用startActivity()方法,开启一个Activity。接下来,Android系统收到这个隐式的意图,通过系统中安装的应用程序的意图过滤器匹配这个Intent,当找到匹配这个Intent的组件之后,系统启动这个匹配的意图,并调用它的onCreate()方法传递Intent。