文章目录
通知通道(Channel)
从 Android 8.0 开始,显示通知必须先创建通道:
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = NotificationFactory.createNotificationChannel();
notificationManager.createNotificationChannel(notificationChannel);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public static NotificationChannel createNotificationChannel() {
String name = "通道名称";
// 设置通道的重要性级别(Android 7.1 或更低需要使用 setPriority 方法)
int importance = NotificationManager.IMPORTANCE_HIGH;
return new NotificationChannel(CHANNEL_ID, name, importance);
}
在构建 Notification Builder 时也需要传入 Channel ID:
new NotificationCompat.Builder(context, CHANNEL_ID)
通知重要性级别
不同场景下的通知,其重要性也可能不同。下表中列出了不同的重要性级别,以及在不同系统版本上设置的方法:
级别 | importance(Android 8.0 及以上) | priority(Android 7.1 及以下) |
---|---|---|
紧急,发出声音并作为警告通知出现 | IMPORTANCE_HIGH | PRIORITY_HIGH 或者 PRIORITY_MAX |
高,发出声音 | IMPORTANCE_DEFAULT | PRIORITY_DEFAULT |
中,没有声音 | IMPORTANCE_LOW | PRIORITY_LOW |
低,没有声音并且不会出现在状态栏中,并且通知会被折叠 | IMPORTANCE_MIN | PRIORITY_MIN |
创建基本通知
基本通知包含小图标、标题和少量内容:
// 从 Android8.0 开始,必须设置 Channel ID
new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(content)
// 设置优先级,优先级决定了 Android7.1 及更低版本通知的侵入程度
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.build();
大文本样式通知
new NotificationCompat.Builder(context, channelId)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(content)
.setPriority(priority)
.setStyle(new NotificationCompat.BigTextStyle())
.build();
带图标样式通知
new NotificationCompat.Builder(context, channelId)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(content)
.setPriority(priority)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
.build();
大图标样式通知
Bitmap iconBitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
Bitmap avatarBitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_avatar);
return new NotificationCompat.Builder(context, channelId)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(content)
.setPriority(priority)
.setLargeIcon(iconBitmap)
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(avatarBitmap))
.build();
响应用户点击
可以通过设置 setContentIntent()
方法来定义当用户点击通知后所执行操作:
Intent intent = new Intent(context, NotificationDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
new NotificationCompat.Builder(context, channelId)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(content)