📜  Android Oreo 中的通知 (8+)

📅  最后修改于: 2022-05-13 01:55:36.240000             🧑  作者: Mango

Android Oreo 中的通知 (8+)

Android Oreo 带来了很多变化。这还包括用户在应用程序中发出通知的方式。在本文中,我们将讨论通知部门需要进行的更改。

发布通知时应牢记以下事项:

  1. 设计通知通道
  2. 每个通知渠道的重要性
  3. 通知 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);
}

让我们详细看看这个方法的作用。

  1. 该方法接受String id、String name、int 重要性。 .
    • 字符串 id:这是您在通知通道中发出通知的 id。您将这个确切的 ID 用于同一频道中的多个通知。
    • 字符串名称:这是当有人点击导航到设置 -> 应用和通知 -> [your_app_name] -> 应用通知时可见的频道名称。
    • int 重要性:这是通道的重要性级别。级别如下:
      1. NotificationManager.IMPORTANCE_MIN - 仅在通知阴影中显示,没有声音或偷看。
      2. NotificationManager.IMPORTANCE_LOW - 到处显示,不发出声音,不偷看。
      3. NotificationManager.IMPORTANCE_DEFAULT - 到处显示,发出声音但不偷看。
      4. NotificationManager.IMPORTANCE_HIGH - 到处显示,发出声音和偷看(视觉中断)。
      5. NotificationManager.IMPORTANCE_MAX – 通常不使用此重要性级别。与 IMPORTANCE_HIGH 类似。

        通常首选 IMPORTANCE_DEFAULT 参数,但这会产生令人讨厌的通知声音。要静音,请在makeNotificationChannel()方法中添加以下行,就在最后一行之前。

        channel.setSound(null, null);
        
  2. 然后该方法使用参数创建通道。
  3. setShowBadge(true) 通过 Oreo 通知点功能使通知可用。
  4. 最后通过 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()方法时,我们得到以下通知: