1. 通知的基本用法

通知的创建

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(context).build();

上述只是创建了一个空的 Notification 对象,并没有什么实际作用。

创建一个丰富的 Notification 对象

Notification notification = new NotificationCompat.Builder(this)
        .setContentTitle("This is content title") // 定义标题
        .setContentText("This is content text")  // 定义正文内容
        .setWhen(System.currentTimeMillis())  // 定义通知时间
        .setSmallIcon(R.mipmap.ic_launcher)  // 定义小图标
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))  // 定义大图标
        .build();
// 第一个参数为通知的 id, 每个通知的 id 都是不同的
manager.notify(1, notification);

如果想让通知可以被点击,我们需要使用 PendingIntent,可以简单理解为延迟的 Intent。

PendingIntent 提供了几个静态方法获取 PendingIntent 实例。

// 第二个参数一般用不到,通常传 0 
// 第三个参数是一个 Intent 对象, 我们通过这个对象构建出 PendingIntent 的意图
// 第四个参数用于确定 PendingIntent 的行为,一般传 0
PendingIntent.getActivity(Context, int, Intent, int);    // 跳转到一个activity组件
PendingIntent.getBroadcast(Context, int, Intent, int);   // 打开一个广播组件
PendingIntent.getService(Context, int, Intent, int);     // 打开一个服务组件

我们写一个可以点击的通知

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.send_notice:
            Intent intent = new Intent(this, NotificationActivity.class);
            PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(this)
                    .setContentTitle("This is content title")
                    .setContentText("This is content text")
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                    .setContentIntent(pi)
                    .build();
            manager.notify(1, notification);
            break;
        default:
            break;
    }
}

点击通知以后并没有消失,让通知消失有两种方法

// 方法一
Notification notification = new NotificationCompat.Builder(this)
        .setAutoCancel(true)
        .build();
// 方法二, 在新的 Activity 中
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(id);

2. 通知的进阶技巧

Notification notification = new NotificationCompat.Builder(this)
        // 指定音频文件
       .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
       // 设置手机震动,参数为一个数组 手机静止的时长,震动的时长,静止的时长,以此类推
       .setVibrate(new long[]{0, 1000, 1000, 1000})
       // 设置 led 灯,参数为 颜色,灯亮的时长,灯暗的时长
       .setLights(Color.GREEN, 1000, 1000)
       // 使用通知的默认效果
       .setDefaults(NotificationCompat.DEFAULT_ALL)
       // 构建出富文本的通知内容,让通知中不仅有文字和图标,还有更加丰富的东西
       .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to build notifications, send and sync data, and use voice actions. Get the official Android IDE and developer tools to build apps for Android."))
       .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.big_image)))
       // 用于设置通知的重要程度
       // PRIORITY_DEFAULT 默认,PRIORITY_MIN 最小,PRIORITY_LOW 较低,PRIORITY_HIGH 重要,PRIORITY_MAX 最高,必须让用户立即看到,甚至做出响应
       .setPriority(NotificationCompat.PRIORITY_MAX)
       .build();