Intent并不是Android应用的组件,但它对于Android应用的作用非常大——它是Android应用内不同组件之间通信的载体。
Intent的作用
当Android运行时需要连接不同的组件时,通常就需要借助于Intent来实现。Intent封装了当前组件需要启动或触发的目标组件的信息。
- 启动Activity:调用Context的startActivity(Intent intent)方法,方法中的Intent参数封装了需要启动的目标Activity的信息;
- 启动Service:调用Context的startService(Intent intent)方法或bindService(Intent service, ServiceConnection conn, int flags)方法,方法中的Intent参数封装了需要启动的目标Service的信息;
- 触发BroadcastReceiver:可调用Context的sendBroadcast(Intent intent)、sendStickyBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent,String receivePermission)方法来发送广播,方法中的Intent参数封装了需要触发的目标BroadcastReceiver的信息。
Intent的优势
有人会认为上面这种做法多此一举,如某Activity需要启动另一个Activity,可以直接使用startActivity(Class activityClass)这样的方法。其实这种方法显然背离了Android的理念,使用Intent的优势主要有两点:
- 提供了一致的编程模型,无论是启动Activity、Service还是BroadcastReceiver,Android可以使用统一的Intent对象来封装这种“启动意图”;
- 解耦:某些时候,程序只想启动具有某种特征的组件(隐式Intent),并不想和某个具体的组件耦合,如果使用startActivity(Class activityClass)的方式来启动组件,会造成硬编码耦合。
Intent的分类
显示意图和隐式意图
- 显示Intent:显示Intent明确指定需要启动或者触发的组件的名称,Android无需对该Intent做任何解析,系统直接找到目标组件,启动或触发它即可。
- 隐式Intent:隐式Intent只是指定需要启动或者触发的组件应满足怎样的条件,Android系统需要对该Intent进行解析,解析出它的条件,然后再去系统中查找与之匹配的目标组件。如果找到符合条件的组件,就启动或触发它们。被调用的组件可以通过IntentFilter来声明自己能处理哪些隐式Intent。
PendingIntent
PendingIntent是对Intent的包装,一般通过调用PendinIntent的getActivity()、getService()、getBroadcastReceiver()静态方法来获取PendingIntent对象。与Intent对象不同的是:PendingIntent通常会传给其他应用组件,从而由其他应用程序来执行PendingIntent所包装的“Intent”。