安排通知

有时需要在特定时间显示通知,不幸的是,这个任务在 Android 系统上并不重要,因为没有方法 setTime() 或类似的通知。此示例概述了使用 AlarmManager 安排通知所需的步骤:

  1. 添加一个听取 Android AlarmManager 播放的 Intents 的 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);
       }
   }
  1. **** 在 AndroidManifest.xml 文件中注册 BroadcastReceiver (否则接收方将不会从 AlarmManager 收到任何 Intent):

    <receiver
        android:name=".NotificationReceiver"
        android:enabled="true" />
    
  2. **** 通过将 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 对于每个预定的通知都必须是唯一的,否则 PendingIntents 会互相替换,造成不良影响!

  3. **** 通过重建关联的 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 步的数字!