在Android系统设计中,Intent可以被应用于除ContentProvider外的其他三种组件(即Activity,Service和BroadcastReceiver)。
一、Intent属性
1、ComponentName
Intent分为显性(Explicit Intents)和隐性(Implicit Intents)。如果在Intent中特别指定了目标方的“Component Name”,同时指定它所在的PackageName,比如:“com.example.project.HelloActivity“,那么系统就会直接将此Intent发往这个特定的应用,而不需要做额外的匹配工作。
2、Category
它将Intent从大的方向上进行区分和归类。Intent的所有属性值实际上都只是一串字符,因而是可以自定义的。
3、Action
表明要做什么,或者什么事件发生了(常用于广播的情况。比如设备开机时会有系统广播发出。如果应用程序希望实现开机自启动,就可以监听这个广播)。用户也可以自定义唯一的Action。
4、Data
如果上面的Action中表明了某人去公安局办理签证,那么这里的Data就作为签证业务的补充材料,Action理论上是围绕Data提供的数据来开展业务的。当然也有不需要Data补充信息的情况,如在ACTION_CALL的情况下,电话号码是必须作为Data来传递的;而针对Broadcast(如ACTION_SCREEN_ON)组件的Action,它们本身就蕴含了足够的信息,因而不需要Data的支持。不同的Action,其对应的Data格式会有差异。
5、Extras
Extras可以理解为Extra Data,是对上面Data属性的补充。不过两者在数据的格式上有明显区别。Data采用了类似scheme://uri的表达方式;而Extras则是一种键值对实现。它们在表达不同场景的数据时有各自的优势,使用时应具体问题具体分析。发送方通过一系列putXxx()方法将键值对存入Intent中,然后接收方 就可以用相对应的getXxx()来获取这些Extra数据,这些方法内部会维护一个Bundle对象来保证进程间数据的准确传输。
6、Flags
Flags和Activity中的LaunchMode功能基本相同,它规定了系统如何去启动一个Activity(比如指定即将启动的Activity应该属于哪一个Task)。
二、Intent匹配规则
Intent是和Intent-filter配套使用的。具体而言,Intent-filter是每个组件的属性标签,它们在AndroidManifest.xml声明时就已经贴上了。而Intent则是程序运行过程中产生的实时需求,系统接收到这些请求后与现有的Intent-filter进行匹配,然后选择最合适的组件元素以响应。打个比方,Intent代表了女生的择偶意愿,而Intent-filter则是众男生的属性描述——年龄、长相、收入等。
Intent的典型匹配过程包括如下几个步骤
1、注册组件
除了在AndroidManifest.xml中静态注册外,BroadcastReceiver还可以在程序运行中进行动态注册。这两种方式区别如下:
- 静态注册
- 动态注册
public class DynamicBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (android.intent.action.BOOT_COMPLETED.equals(intent.getAction)) {
//相应处理
} else {
//其他处理
}
}
}
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.BOOT_COMPLETED");
registerReceiver(new DynamicBroadcastReceiver(), filter);
2、发起方主动向系统提供Intent
Activity---->对应startActivity();
Service---->对应startService();
BroadcastReceiver---->对应sendBroadcast();
3、系统将Intent和对应组件类型里所有的intent-filter进行匹配,以寻找最佳结果
影响Intent匹配规则的只有3个关键因素,即:
- Category
- Action
- Data