Android 8.0 Oreo中引入的最重要功能之一是通知渠道。 通知渠道使您可以对通知进行分组,以便发布到通道的所有通知都具有相同的行为。 例如,您可能有一个用于需要立即关注的通知的通知通道,以及用于信息性消息的单独的“较安静”通道。

例如,查看安装了Android Oreo的YouTube应用程序(点击设置>应用程序和通知>通知>通知,然后从列表中选择YouTube)。 第一个屏幕(左侧)列出两个通知类别:下载通知和一般通知:

Screenshots of YouTube Notification Categories

这些类别中的每一个都是通知频道:YouTube应用实施了“下载通知”频道和“常规通知”频道。 点按第一个屏幕中的“下载通知”,该屏幕将显示应用下载通知频道的设置屏幕(请参阅上面的第二个屏幕)。 请注意,您不能完全控制通知渠道与用户的交互方式; 他/她可以修改设备上的任何通知通道的设置,如上面的屏幕截图所示(不过,您可以配置默认值,如下所述)。 在此屏幕中,用户可以通过执行以下操作来修改“下载通知”通道的行为:

  • 将“重要性”级别设置为“紧急”,“高”,“中”或“低”,从而配置声音和视觉中断级别。
  • 打开或关闭通知点。
  • 打开或关闭闪烁的灯。
  • 显示或隐藏锁定屏幕上的通知。
  • 覆盖免打扰设置。

一般通知频道(第三屏幕)具有类似的设置。 正如这些示例所示,新的通知渠道功能使您可以对用户进行对不同类型通知的细粒度控制。

是否应该将通知渠道的支持添加到您的应用程序? 如果您的目标是Android 8.0,您的应用必须实施通知渠道。 针对Oreo的应用尝试在不使用通知渠道的情况下向用户发送本地通知将无法在Oreo设备上显示通知。 如果您不瞄准Android 8.0,您的应用程序仍然会在Android 8.0上运行,但具有与在Android 7.1或更低版本上运行时相同的通知行为。

创建通知频道

要创建通知通道,请执行以下操作:

  1. 使用以下命令构造一个NotificationChannel对象:
    • 包中的唯一ID字符串。 在以下示例中,使用了字符串com.xamarin.myapp.urgent。
    • 频道的用户可见名称(少于40个字符)。 在以下示例中,使用名称Urgent。
    • 频道的重要性,它控制如何将中断通知发布到NotificationChannel。 重要性可以是默认,高,低,最大,最小,无,或未指定。

    将这些值传递给构造函数:

    点击(此处)折叠或打开

    1. public const string URGENT_CHANNEL = com.xamarin.myapp.urgent;
    2. . . .
    3. string chanName = GetString(Resource.String.noti_chan_urgent);
    4. var importance = NotificationImportance.High;
    5. NotificationChannel chan = new NotificationChannel(URGENT_CHANNEL, chanName, importance);


    在这个代码示例中,Resource.String.noti_chan_urgent设置为“紧急”。

  1. 使用初始设置配置NotificationChannel对象。 例如,以下代码会配置NotificationChannel对象,以便发布到此频道的通知将默认振动设备并显示在锁定屏幕上:

    点击(此处)折叠或打开

    1. chan.EnableVibration (true);
    2. chan.LockscreenVisibility = NotificationVisibility.Public;

  2. 将通知通道对象提交给通知管理器:

    点击(此处)折叠或打开

    1. NotificationManager notificationManager =
    2.     (NotificationManager) GetSystemService (NotificationService);
    3. notificationManager.CreateNotificationChannel (chan);

发布到通知频道

要将通知发布到通知通道,请执行以下操作:

  1. 使用Notification.Builder配置通知,将通道ID传递给SetChannelId方法。 例如:

    点击(此处)折叠或打开

    1. Notification.Builder builder = new Notification.Builder (this)
    2.     .SetContentTitle ("Attention!")
    3.     .SetContentText ("This is an urgent notification message")
    4.     .SetChannelId (URGENT_CHANNEL);


  2. 使用通知管理器的通知方法构建和发出通知:

    点击(此处)折叠或打开

    1. public const int NOTIFY_ID = 1100;
    2. . . .
    3. notificationManager.Notify (NOTIFY_ID, builder.Build());

而已! 您可以重复上述步骤为信息性消息创建另一个通知通道。 例如,默认情况下,此第二个通道可以禁用振动,将默认锁定屏幕可见性设置为“私人”,并将通知重要性设置为“默认”。

有关Android Oreo通知渠道的完整代码示例,请参阅NotificationChannels示例; 此示例应用程序管理两个通道并设置其他通知选项。

如果您不熟悉如何在Xamarin.Android中创建通知,请参阅本地通知和本地通知演练。