有时需要在特定时间显示通知,但不幸的是,此任务在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步中的数字相匹配!