Android调度通知

示例

有时需要在特定时间显示通知,但不幸的是,此任务在Android系统上并不简单,因为没有setTime()用于通知的方法或类似方法。本示例概述了使用计划通知的步骤AlarmManager:

  1. 添加一个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);
       }
   }
  1. BroadcastReceiver在您的AndroidManifest.xml文件中注册(否则接收者将不会收到Intent来自的任何AlarmManager):

    <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);
        // 时间表通知
        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);
        // 取消通知
        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        manager.cancel(pending);
    }

请注意,42以上内容必须与第3步中的数字相匹配!