Android Oreo 中的通知 (8+)
Android Oreo 带来了很多变化。这还包括用户在应用程序中发出通知的方式。在本文中,我们将讨论通知部门需要进行的更改。
发布通知时应牢记以下事项:
- 设计通知通道
- 每个通知渠道的重要性
- 通知 ID(不同于频道 ID)不应设置为零。
在继续之前,请确保在 build.gradle (Module: app) 依赖项中添加了这一行:
implementation 'com.android.support:appcompat-v7:26.1.0'
让我们从制作通知渠道开始。下面的方法创建一个通知通道:
@RequiresApi(api = Build.VERSION_CODES.O)
void makeNotificationChannel(String id, String name, int importance)
{
NotificationChannel channel = new NotificationChannel(id, name, importance);
channel.setShowBadge(true); // set false to disable badges, Oreo exclusive
NotificationManager notificationManager =
(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
assert notificationManager != null;
notificationManager.createNotificationChannel(channel);
}
让我们详细看看这个方法的作用。
- 该方法接受String id、String name、int 重要性。 .
- 字符串 id:这是您在通知通道中发出通知的 id。您将这个确切的 ID 用于同一频道中的多个通知。
- 字符串名称:这是当有人点击导航到设置 -> 应用和通知 -> [your_app_name] -> 应用通知时可见的频道名称。
- int 重要性:这是通道的重要性级别。级别如下:
- NotificationManager.IMPORTANCE_MIN - 仅在通知阴影中显示,没有声音或偷看。
- NotificationManager.IMPORTANCE_LOW - 到处显示,不发出声音,不偷看。
- NotificationManager.IMPORTANCE_DEFAULT - 到处显示,发出声音但不偷看。
- NotificationManager.IMPORTANCE_HIGH - 到处显示,发出声音和偷看(视觉中断)。
- NotificationManager.IMPORTANCE_MAX – 通常不使用此重要性级别。与 IMPORTANCE_HIGH 类似。
通常首选 IMPORTANCE_DEFAULT 参数,但这会产生令人讨厌的通知声音。要静音,请在makeNotificationChannel()方法中添加以下行,就在最后一行之前。
channel.setSound(null, null);
- 然后该方法使用参数创建通道。
- setShowBadge(true) 通过 Oreo 通知点功能使通知可用。
- 最后通过 NotificationManager 的 createNotificationChannel() 方法创建通知通道。
现在让我们发出通知。我们将使用NotificationCompat来实现向后兼容性。
void issueNotification() { // make the channel. The method has been discussed before. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { makeNotificationChannel("CHANNEL_1", "Example channel", NotificationManager.IMPORTANCE_DEFAULT); } // the check ensures that the channel will only be made // if the device is running Android 8+ NotificationCompat.Builder notification = new NotificationCompat.Builder(this, "CHANNEL_1"); // the second parameter is the channel id. // it should be the same as passed to the makeNotificationChannel() method notification .setSmallIcon(R.mipmap.ic_launcher) // can use any other icon .setContentTitle("Notification!") .setContentText("This is an Oreo notification!") .setNumber(3); // this shows a number in the notification dots NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); assert notificationManager != null; notificationManager.notify(1, notification.build()); // it is better to not use 0 as notification id, so used 1. }
执行以这种方式进行:
- 首先,上述方法最初创建了一个 id = “CHANNEL_1” 且名称为 “Example channel” 的通知通道。 id 在任何地方都看不到,但可以通过打开应用信息页面的“应用通知”选项来查看名称。
- 然后创建一个 NotificationCompat.Builder 对象,将上下文和 id 指定为“CHANNEL_1”。如果使用makeNotificationChannel()方法制作,则可以提及不同的频道 ID。
其余的不言自明。 setNumber()方法在应用程序的通知点中显示一个数字。 - 最后,通知 id(这里为 1)最好不要设置为 0,因为在通知用于前台服务的情况下,如果 id 为 0,它将无法显示。在执行issueNotification()方法时,我们得到以下通知: