PendingIntent内包装了一个Intent,将PendingIntent传递给其他业务模块,如通知Notification、PackageInstaller后,其他业务模块会发送此Intent。PendingIntent起到回调的作用。
PendingIntent还可以cancel。
- PendingIntent使用场景举例
一、通知的使用场景
Intent intent = xxx;
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, flag);
Icon icon = Icon.createWithResource(context, android.R.drawable.stat_sys_download_done);
Notification.Builder builder = null;
builder = new Notification.Builder(context, channelID)
.setContentIntent(pending)
.setContentTitle("xxx")
.setContentText("xxx")
.setSmallIcon(icon)
.setAutoCancel(true);
nm.notify(24, builder.build());
通知模块内,点击通知就会触发发送Intent。
二、PackageInstaller的使用场景
PackageInstaller packageInstaller = CONTEXT.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
int sessionId = packageInstaller.createSession(params);
Session session = packageInstaller.openSession(sessionId);
OutputStream packageInSession = session.openWrite("package", 0, -1);
FileInputStream inputStream = new FileInputStream(apkPath);)
byte[] buffer = new byte[16384];
int n;
while ((n = inputStream.read(buffer)) >= 0) {
packageInSession.write(buffer, 0, n);
}
Intent intent = new Intent(INTENT_APK_INSTALL);
PendingIntent pendingIntent = PendingIntent.getBroadcast(CONTEXT, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.getIntentSender();
// Commit the session (this will start the installation workflow).
session.commit(statusReceiver);
PackageInstaller安装成功、失败、或者其他状态,就会发送这个Intent的广播,开发中考虑接收和处理。
- PendingIntent包装Intent的三种方式
依次发送出Activity、Broadcast、Service。比如,如果用getBroadcast包装的Intent,但是此Intent的action对应的是个Service,是接收不到这个Intent的。包装Intent时,一定要注意一致,我踩过坑,所以特意强调一下。
// PendingIntent pendingIntent =
PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags);
PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags);
PendingIntent.getService(Context context, int requestCode, Intent intent, int flags);
PendingIntent.getForegroundService(Context context, int requestCode, Intent intent, int flags);
/**
* requestCode:每次的requestCode不同,会产生不同的PendingIntent;
- * flags:FLAG_CANCEL_CURRENT、FLAG_UPDATE_CURRENT、FLAG_NO_CREATE、FLAG_ONE_SHOT
*/
1.FLAG_CANCEL_CURRENT:如果AlarmManager管理的PendingIntent已经存在,那么将会取消当前的PendingIntent,从而创建一个新的PendingIntent.
2.FLAG_UPDATE_CURRENT:如果AlarmManager管理的PendingIntent已经存在,让新的Intent更新之前Intent对象数据, 例如更新Intent中的Extras,另外,我们也可以在PendingIntent的原进程中调用PendingIntent的cancel ()把其从系统中移除掉
3.FLAG_NO_CREATE:如果AlarmManager管理的PendingIntent已经存在,那么将不进行任何操作,若描述的Intent不存直接返回NULL(空).
4.FLAG_ONE_SHOT:该PendingIntent只作用一次.在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的