安排通知
有时需要在特定时间显示通知,不幸的是,这个任务在 Android 系统上并不重要,因为没有方法 setTime()
或类似的通知。此示例概述了使用 AlarmManager
安排通知所需的步骤:
- 添加一个听取 Android
AlarmManager
播放的Intent
s 的BroadcastReceiver
。
这是你根据 Intent
提供的附加功能构建通知的地方:
public class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Build notification based on Intent
Notification notification = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_notification_small_icon)
.setContentTitle(intent.getStringExtra("title", ""))
.setContentText(intent.getStringExtra("text", ""))
.build();
// Show notification
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(42, notification);
}
}
-
**** 在
AndroidManifest.xml
文件中注册BroadcastReceiver
(否则接收方将不会从AlarmManager
收到任何Intent
):<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); // Schdedule notification AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pending); }
请注意,上面的
42
对于每个预定的通知都必须是唯一的,否则PendingIntent
s 会互相替换,造成不良影响! -
**** 通过重建关联的
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); // Cancel notification AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.cancel(pending); }
请注意,上面的 42
需要匹配第 3 步的数字!