PendingIntent 是 Android 中的一种特殊的 Intent,用于在应用外部(例如其他应用或系统组件)延迟执行操作。它封装了一个 Intent 和一个操作(如广播、服务、活动),并允许其他应用或系统以应用的权限执行这些操作。
结构
PendingIntent 的结构包括以下要素:
- Intent:要延迟执行的操作。
- 操作类型:包括
getActivity
、getService
、getBroadcast
。 - 上下文(Context):提供 PendingIntent 所需的环境。
- 请求码(Request Code):用于区分不同的 PendingIntent 实例。
- 标志(Flags):定义 PendingIntent 的行为(如更新现有 PendingIntent)。
作用
PendingIntent 的主要作用是延迟执行操作,特别是在以下场景中:
- 通知:通过 PendingIntent,用户点击通知时可以启动活动、服务或发送广播。
- AlarmManager:定时执行任务。
- 跨应用通信:允许应用之间共享操作,例如授权其他应用发送广播或启动服务。
实际开发中的应用
获取USB权限
private PendingIntent permissionIntent;
// 初始化权限请求的 PendingIntent
permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_UPDATE_CURRENT);
//省略中间部分代码
if (device != null && isDeviceMatch(device)) {
//若无权限, 请求 USB 设备权限
if (!usbManager.hasPermission(device)) {
usbManager.requestPermission(device, permissionIntent);
} else {
// 向 USB 设备发送 AT 指令
sendATCommand(device);
}
}
和Intent 的区别(为什么要有PendingIntent?)
Intent事件在程序启动之时就会执行,Intent 事件的执行时机取决于你调用相关方法的时间。例如,当你调用 startActivity(intent)
方法时,系统会立即启动对应的 Activity;当你调用 sendBroadcast(intent)
方法时,系统会立即发送广播。PendingIntent可以延迟执行,是因为它的启动是由其它事件来触发的,可以抽象理解为其它事件是一个按钮,按下会触发PendingIntent。通常,PendingIntent 用于在用户执行某些操作时(比如点击通知、点击小部件、点击某个按钮等)执行相关的操作。可以将其视为一个 "待执行的 Intent",而待执行的时机由其他事件来触发。