PendingIntent主要用于包装一个Intent及该Intent对应的动作。
例如,PendingIntent调用getSerivce接口,可以包装一个启动Service的Intent;
调用getActivity接口,可以包装一个启动Activity的Intent。
PendingIntent一般与AlarmManager、Notification等一起工作。
例如:
public static void setServiceAlarm(Context context, boolean isOn) {
//得到启动服务对应的Intent
Intent i = PollService.newIntent(context);
//利用PendingIntent的getService接口,得到封装后的PendingIntent
//第二个参数,是区分PendingIntent来源的请求代码
//第四个参数,是决定如何创建PendingIntent的标志位
PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
AlarmManager alarmManager = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
if (isOn) {
//AlarmManager循环处理PendingIntent
//其中,第一个参数描述定时器时间基准常量
//第二个参数指定定时器启动的时间
//第三个参数指定时间间隔
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime(), POLL_INTERVAL, pi);
} else {
//取消定时器
alarmManager.cancel(pi);
//同时调用PendingIntent的cancel接口
pi.cancel();
}
}
使用AlarmManager安排周期任务后,PendingIntent将被定时处理,
每次都可以拉起其中封装的服务。
上述例子中,提到了创建PendingIntent时,可以指定标志位,例如:
public static boolean isServiceAlarmOn(Context context) {
Intent i = PollService.newIntent(context);
//指定FLAG_NO_CREATE后,不会主动创建PendingIntent,而是读取系统中的记录,
PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_NO_CREATE);
return pi != null;
}
PendingIntent与Notification合作的代码类似于:
...........
Resources res = getResources();
Intent i = PhotoGalleryActivity.newIntent(this);
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
//这里使用的支持库中的NotificationCompat
Notification notification = new NotificationCompat.Builder(this)
//设置通知对应的一些信息
.setTicker(res.getString(R.string.new_pictures_title))
.setSmallIcon(android.R.drawable.ic_menu_report_image)
.setContentTitle(res.getString(R.string.new_pictures_title))
.setContentText(res.getString(R.string.new_pictures_text))
//添加通知对应的PendingIntent
//一旦点击通知后,PendingIntent将被处理
.setContentIntent(pi)
.setAutoCancel(true)
.build();
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(this);
notificationManager.notify(0, notification);
.............