从Android O Api开始创建通知渠道的正确方法

16

从Android O(API 26)版本引入的通知渠道。我从以下链接中了解到:

问题:

  1. 如果我有多个通知,那么在应用程序启动时创建通知渠道并将其保留在ApplicationScope中是否是一个好主意?

public void addNotificationChannels(Context context) {

    List<NotificationChannel> channels = new ArrayList<>();
    channels.add("channel_1");
    channels.add("channel_2");
    .
    .
    channels.add("channel_7");

    NotificationManager notificationManager =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.createNotificationChannels(channels);

}
  • 如果在向通知管理器添加通道之前尝试执行此行new Notification.Builder(getApplicationContext(), PRIMARY_CHANNEL),会发生什么

  • 4个回答

    18

    我的做法是扩展应用程序类(别忘了在应用的清单文件中更新类名),并在onCreate方法中创建通知通道。这样可以保证在构建通知时,通知通道总是被创建。

    我认为每次为每个通知(尝试)创建通知通道都是浪费CPU周期。

    另外,我也总是以这种方式记录应用程序版本,当有人发送logcat时,这非常有用。


    3
    我现在正在这样做。在MyApplication类的onCreate()方法中创建它们。这是正确的方法吗? - sam_k
    在我的情况下,创建3个通道大约需要14毫秒。 - ror
    我同意,并感谢您告诉我我们也可以扩展应用程序类。这将非常有用。 - jasxir
    2
    每次启动应用程序都创建一个通知渠道不是浪费 CPU 循环吗? - YTerle
    1
    @YTerle 请看来自文档的这句话 - “使用其原始值创建现有通知渠道不执行任何操作,因此在启动应用程序时调用此代码是安全的。” - Vadim Kotov
    如果我在应用程序的onCreate中进行了通道设置,并在检查其是否存在后进行了设置,那么这会影响我的午餐时间吗? - Moustafa EL-Saghier

    11
    1. 理想情况下,在发布通知时应该同时创建通道。 使用先前使用的相同id调用createNotificationChannel是安全的,不会重新创建通道。
    2. 您的应用程序将无法发布此通知。系统可能会显示警告消息,指出您的应用程序不允许发布此通知。

    我没有理解你的第一个回答。假设我有多个通道(A、B、C、D),我正在在通道B下创建媒体播放器通知,那么每次填充媒体通知时使用notificationManager.createNotificationChannel(B)是一个好主意吗? 这样做的好处是什么,而不是应用程序启动时只执行一次? - sam_k
    1
    如果通道已经存在,系统会简单地忽略它。您可以在创建通道之前进行检查:NotificationChannel notificationChannel = notificationManager.getNotificationChannel(channel); 如果notificationChannel不为空,则表示通道已经存在。如果您提前创建所有通道,用户也可以提前禁用所有通道。 - Arnav M.
    1
    我猜你没有理解我的实际问题。我更想知道创建通知渠道的正确模式。在应用程序的100个位置每次创建通道并不是一个好主意。 - sam_k
    你应该创建一个通用的方法来发布通知,而不是在100个地方重写它。 - Arnav M.
    6
    但是那种通用方法会调用100次,而且调用createChannel也会进行100次并不是一个好的做法。 - sam_k

    7

    A) 在创建通知的同时:

    根据文档所述:

    使用其原始值创建现有通知通道不执行任何操作,因此在启动应用程序时调用此代码是安全的。

    因此,您可以在创建通知本身的同时安全地创建通知通道,无需检查通道是否已经创建。

    B) 在 Application 或任何 Activity/Fragment 中。

    注意:如果您正在使用原始 FCM,则在 SDK 为您发布通知之前创建通道非常重要,因为根据推送消息负载参数 android_channel_id,您可以将该推送与已在应用中创建的特定通道关联起来。

    FCM 负载:https://firebase.google.com/docs/cloud-messaging/http-server-ref


    1
    在提到这个的地方,有官方文档。谢谢。 - Kathir

    2

    我认为有两种合理的方法:
    1. 在应用程序子类中创建所有通道
    2. 在你的主要Activity中创建所有通道,该Activity首先启动应用程序。


    如果有一个服务发布通知,这个程序就无法工作。 - M66B

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接