Android开发之——通知Notification

介绍

Android O引入了通知渠道(Notification Channels),以提供统一的系统来帮助用户管理通知,如果是针对Android O为目标平台时,必须实现一个或者多个通知渠道,以向用户显示通知。若并不以Android O为目标平台,当应用运行在Android O设备上时,其行为将与运行在Android 7.0上时相同。

开发者可以为需要发送的每个不同的通知类型创建一个通知渠道。还可以创建通知渠道来反映应用的用户做出的选择。例如,可以为聊天应用的用户创建的每个聊天组建立单独的通知渠道。

Android O的用户可以使用一致的系统UI管理大多数与通知有关的设置。所有发布至通知渠道的通知都具有相同的行为。当用户修改任何下列特性的行为时,修改将作用于通知渠道;

使用Notification

通过NotificationManager的creaeNotificationChannel方法来创建NotificationChannel。

public void createNotificationChannel(String id, String name, int importance, String desc) {
    if (mNotificationManager.getNotificationChannel(id) != null) return;
    NotificationChannel notificationChannel = new NotificationChannel(id, name, importance);
    notificationChannel.enableLights(true);
    notificationChannel.enableVibration(true);
    notificationChannel.setLightColor(Color.RED);
    notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
    notificationChannel.setShowBadge(true);
    notificationChannel.setBypassDnd(true);
    notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400});
    notificationChannel.setDescription(desc);
    mNotificationManager.createNotificationChannel(notificationChannel);
}

NotificationChannel的方法列表:

  • getId()-获取ChannelId
  • enableLights()-开启指示灯,如果设备有的话
  • setLightColor()-设置指示灯颜色
  • enableVibration()-开启震动
  • setImportance()-设置频道重要性
  • getImportance()-获取频道重要性
  • setSound()-设置声音
  • getSound()-获取声音
  • setGroup()-设置ChannleGroup
  • getGroup()-得到ChannleGroup
  • setBypassDnd()-设置绕过免打扰模式
  • canBypassDnd()-检测是否绕过免打扰模式
  • getName()-获取名称
  • setLockScreenVisibility()-设置是否应在锁定屏幕上显示此频道的通知
  • getLockScreenVisibility()-检测是否在锁定屏幕上显示此频道的通知
  • setShowBage()-设置是否显示角标
  • canShowBage()-检测是否显示角标

setImportance重要程度

importance越高,提示权限就越高,最高的支持发出声音和悬浮通知

public static final int IMPORTANCE_DEFAULT = 3;
public static final int IMPORTANCE_HIGH = 4;
public static final int IMPORTANCE_LOW = 2;
public static final int IMPORTANCE_MAX = 5;
public static final int IMPORTANCE_MIN = 1;
public static final int IMPORTANCE_NONE = 0;
public static final int IMPORTANCE_UNSPECIFIED = -1000;

删除NotificationChannel

通过NotificationManager的deleteNotificationChannel方法来删除NotificationChannel。

mNotificationManager.deleteNotificationChannel(chatChannelId);

发出通知

只需要设置一个Channelld既可发布到对应的Channel上,需要注意的是NotificationChannel一定要先创建才行。

Notification.Builder builder = new Notification.Builder(this, chatChannelId);
builder.setSmallIcon(R.mipmap.ic_launcher)
    .setContentTitle("Gavin")
    .setContentText("Today released Android 8.0 version of its name is Oreo")
    .setAutoCancel(true);
Intent resultIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);
mNotificationManager.notify((int) System.currentTimeMillis(), builder.build());

显示角标

首先要开启允许使用通知圆点,这个是用户可以取消的,如果你要显示一定要代码中保证是开启状态。

NotificationChannel开启角标

notificationChannel.setShowBadge(true);

NotificationChannel设置角标样式

new Notification.Builder(this, chatChannelId).setBadgeIconType(BADGE_ICON_SMALL)

Notification设置角标计数

new Notification.Builder(this, chatChannelId).setNumber(1)

跳转到设置

Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_CHANNEL_ID, chatChannelId);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
startActivity(intent);

使用NotificationChannleGroup

如果你的通知渠道比较多,那么就可以考虑使用NotificationChannelGroup来管理一下

创建NotificationChannleGroup

和创建NotificaitonChannle类似
mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

NotificationChannle 绑定 groupId

notificationChannel.setGroup(groupId);  

删除 NotificationChannleGroup

可以批量删除该 Group 下的所有 Channel
mNotificationManager.deleteNotificationChannelGroup(groupId2);

源码:
NotificationSample

参考:
Android - 吃奥利奥系列(1) Notification
Android O Preview 之 通知渠道(Notification Channels)