Activity
Context.startActivity(Intent intent);
Context.startActivityForResult(Intent intent); -- Activity.setResult(int resultCode);
Service
Context.startService(Intent intent);
Context.startBindService(Intent intent);
BroadcastReceiver
Context.sendBroadcast(Intent intent);
Context.sendOrderedBroadcast(Intent intent);
Context.sendStickyBroadcast(Intent intent);
不同组件间的Intent互不重叠,也就是说广播Intent只能传递给广播接收器,绝不会传递给Activity或Service。
一个Intent对象其实就是信息的捆绑。它包含收到此Intent的组件所感兴趣的信息以及Android系统感兴趣的信息。原则上,Intent对象可以包含以下属性:
Component name
处理该Intent的组件名称(目标组件的类路径),可选。
组件名可以通过setComponent()、setClass()、setClassName()设置,通过getComponent()读取。
组件名的设置与否对应于Intent的两种解析情况:显式意图、隐式意图。
Action
Action是一个字符串,用来命名要执行的动作。
Intent类定义了一系列的action常量。我们也可以根据需要自定义。
Data
执行Action时需要的数据。包含数据URI(scheme://host:port/path)和数据的MIME类型。
Category
被执行动作的附加信息。
Extras
包含其它附加信息的键值对集合。
Flags
指导Android系统启动一个Activity以及Activity启动之后的处理。
当使用Intent时,直接指定Intent的Component,那么Android系统将无需解析Intent。当没有指定Component时,这时Android系统通过IntentFilter解析Intent,并查找Intent的处理者。IntentFilter通过在AndroidManifest.xml文件注册(BroadcastReceiver可以通过Context.registerReceiver()动态注册)。在解析Intent时,Android是通过其中的action、data、category3个属性来判断,任一属性不匹配,都不会把Intent交给组件。判断方法如下:
如果Intent指定了action,则目标组件的IntentFilter的action列表中必须含有这个action,否则不能匹配。
如果Intent指定了data,但没有提供mimeType,系统将从data中得到数据类型。也就是说,通过scheme来判断mimeType。
如果Intent指定了category(1个或多个),那么IntentFilter需包含所有的category。有一个例外:通过startActivity(),IntentFilter只要包含Intent中其中一个category即可。
PackageManager提供了query...()方法用于查询匹配Intent的组件。