有时需要在特定时间显示通知,但不幸的是,此任务在Android系统上并不简单,因为没有setTime()用于通知的方法或类似方法。本示例概述了使用计划通知的步骤AlarmManager:
添加一个BroadcastReceiver可收听IntentAndroid广播的AlarmManager。
在这里,您可以根据随附的其他功能来构建通知Intent:
public class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 基于意图构建通知
Notification notification = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_notification_small_icon)
.setContentTitle(intent.getStringExtra("title", ""))
.setContentText(intent.getStringExtra("text", ""))
.build();
// 显示通知
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(42, notification);
}
}BroadcastReceiver在您的AndroidManifest.xml文件中注册(否则接收者将不会收到Intent来自的任何AlarmManager):
<receiver android:name=".NotificationReceiver" android:enabled="true" />
安排的通知通过传递PendingIntent您BroadcastReceiver与所需的Intent额外的系统AlarmManager。给定时间到达后,您BroadcastReceiver将收到Intent并显示通知。以下方法调度通知:
public static void scheduleNotification(Context context, long time, String title, String text) {
Intent intent = new Intent(context, NotificationReceiver.class);
intent.putExtra("title", title);
intent.putExtra("text", text);
PendingIntent pending = PendingIntent.getBroadcast(context, 42, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 时间表通知
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pending);
}请注意,42上述内容对于每个计划的通知都必须是唯一的,否则PendingIntents将会彼此替换,从而导致不良后果!
通过重建关联PendingIntent并在系统上取消通知来取消通知AlarmManager。以下方法取消通知:
public static void cancelNotification(Context context, String title, String text) {
Intent intent = new Intent(context, NotificationReceiver.class);
intent.putExtra("title", title);
intent.putExtra("text", text);
PendingIntent pending = PendingIntent.getBroadcast(context, 42, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 取消通知
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.cancel(pending);
}请注意,42以上内容必须与第3步中的数字相匹配!