8 题: 在Android O中不推荐使用NotificationCompat.Builder

在...创建的问题 Thu, Feb 22, 2018 12:00 AM

将我的项目升级到 Android O

 
buildToolsVersion "26.0.1"

Android Studio中的Lint显示以下通知构建器方法的已弃用警告:

 
new NotificationCompat.Builder(context)

问题在于: Android开发者更新了描述 NotificationChannel 的文档,以支持Android O中的通知,并向我们提供了一个代码段,但同样的弃用警告:  

Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

通知概述

我的问题:是否有其他解决方案可用于构建通知,并且仍然支持Android O?

我找到的解决方案是将通道ID作为Notification.Builder构造函数中的参数传递。但是这个解决方案并不完全可以重复使用。

 
new Notification.Builder(MainActivity.this, "channel_id")
    
127
  1. 但是这个解决方案并不完全可重用。怎么样?
    2017-08-02 13:45:54Z
  2. NotificationCompat.Builder已弃用,而不是Notification.Builder。注意Compat部分消失了。通知是他们的新课程,他们正在简化一切
    2017-08-02 13:50:27Z
  3. @ kapsym实际上是另一种方式。 Notification.Builder是旧版
    2017-08-02 13:52:12Z
  4. 另外我没有看到它在这里弃用 developer.android.com/reference/android/support/v4/app /... 。也许是Lint
    中的一个错误
    2017-08-02 13:54:20Z
  5. 通道id在构造函数中传递,或者可以使用notificationBuild.setChannelId("channel_id")放置。在我的情况下,这个最后的解决方案更加可重复使用,因为我的NotificationCompat.Builder在几种方法中被重用,节省了图标,声音和振动的参数。
    2017-08-02 13:57:05Z
  6. 醇>
    8个答案                              8 跨度>                         

    文档中提到构建器方法NotificationCompat.Builder(Context context)已被弃用。我们必须使用具有channelId参数的构造函数:

     
    NotificationCompat.Builder(Context context, String channelId)
    

    https://developer.android.com/参考/机器人/支撑/V4 /应用/NotificationCompat.Builder.html

      

    在API级别26.0.0-beta1中不推荐使用此构造函数。使用   改为NotificationCompat.Builder(Context,String)。全部发布   通知必须指定NotificationChannel Id。

    https://developer.android.com/reference/android/应用程序/Notification.Builder.html

      

    这个构造函数在API级别26中已弃用。使用   而是Notification.Builder(Context,String)。全部发布   通知必须指定NotificationChannel Id。

    如果要重用构建器设置器,可以使用channelId创建构建器,并将该构建器传递给帮助器方法并在该方法中设置首选设置。

        
    124
    2017-08-02 15:52:25Z
    1. 在NotificationChannel会话中发布Notification.Builder(context)解决方案时,似乎自相矛盾。但是,至少你发现一个帖子通知这个弃用=)
      2017-08-02 16:00:21Z
    2. 什么是你能解释一下channelId吗?
      2018-01-26 08:39:07Z
    3. 什么是channelId?
      2018-01-30 16:55:49Z
    4. 您还可以使用NotificationCompat.Builder(Context context),然后像这样分配频道:builder.setChannelId(String channelId)
      2018-04-30 10:27:58Z
    5. 频道ID可以是任何字符串,它在评论中讨论太大,但它用于将通知分成类别,以便用户可以禁用他认为对他来说并不重要,而不是阻止你的应用程序中的所有通知。
      2018-05-15 08:16:58Z
    6. 醇>

    以下是所有Android版本的工作代码,从 API LEVEL 26 + 开始,具有向后兼容性。

     
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext(), "M_CH_ID");
    
            notificationBuilder.setAutoCancel(true)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setTicker("Hearty365")
                    .setPriority(Notification.PRIORITY_MAX) // this is deprecated in API 26 but you can still use for below 26. check below update for 26 API
                    .setContentTitle("Default notification")
                    .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
                    .setContentInfo("Info");
    
    NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, notificationBuilder.build());
    
      
        

    更新API 26以设置最高优先级

      
     
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_MAX);
    
            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }
    
    
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
    
        notificationBuilder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher)
                .setTicker("Hearty365")
           //     .setPriority(Notification.PRIORITY_MAX)
                .setContentTitle("Default notification")
                .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
                .setContentInfo("Info");
    
        notificationManager.notify(/*notification id*/1, notificationBuilder.build());
    
        
    98
    2018-08-07 04:10:07Z
    1. 如何让通知实际显示在应用程序的屏幕上,或者是否在另一个应用程序中显示?
      2017-11-19 01:27:21Z
    2. @ BlueBoy我没有收到您的问题。你能解释一下你到底需要什么吗?
      2017-11-20 04:20:42Z
    3. @ Aks4125通知不会向下滑动并显示在屏幕顶部。您听到一个提示音,状态栏中会出现一个微小的通知图标 - 但没有任何内容向下滑动,并显示如果您收到txt消息。
      2017-11-20 20:26:48Z
    4. @ BlueBoy您需要为该行为将优先级设置为HIGH。如果您需要我更新此代码,请与我们联系。如果你潜入高优先级通知,你会得到答案。
      2017-12-04 05:10:3​​5Z
    5. @BlueBoy检查更新的答案。如果您没有定位26 API,那么只需使用.setPriority(Notification.PRIORITY_MAX)相同的代码,否则请使用26 API的更新代码。 `
      2017-12-04 08:03:24Z
    6. 醇>

    调用2-arg构造函数:为了与Android O兼容,请致电support-v4 NotificationCompat.Builder(Context context, String channelId)。在Android N或更早版本上运行时,channelId将被忽略。在Android O上运行时,也可以使用相同的NotificationChannel创建channelId

    过时示例代码:多个JavaDoc页面上的示例代码,例如new Notification.Builder(mContext)的html“rel =”noreferrer“> Notification.Builder 已过期。

    弃用的构造函数: Notification.Builder(Context context) v4 NotificationCompat.Builder(Context context)已弃用,取而代之的是Notification[Compat].Builder(Context context, String channelId)。 (参见 Notification.Builder( android.content.Context)和v4 NotificationCompat.Builder(Context context)。)

    弃用的课程:不推荐使用整个班级 v7 NotificationCompat.Builder。 (请参阅 v7 NotificationCompat.Builder 。) ,v7 NotificationCompat.Builder需要支持NotificationCompat.MediaStyle。在Android O中,媒体中有一个v4 NotificationCompat.MediaStyle -compat library android.support.v4.media包。如果你需要MediaStyle,请使用那个。

    API 14 +:在26.0.0及更高版本的支持库中,support-v4和support-v7软件包都支持最低API级别14. v#名称是历史名称。

    请参阅最新支持库修订

        
    27
    2017-08-09 01:15:10Z

    没有检查Build.VERSION.SDK_INT >= Build.VERSION_CODES.O那么多的答案,而是有一种稍微简单的方法 -

    将以下行添加到 AndroidManifest.xml 文件的application部分,如在Android上设置Firebase云消息传递客户端应用程序 doc:

     
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id" 
            android:value="@string/default_notification_channel_id" />
    

    然后在 values /strings.xml 文件中添加一个包含频道名称的行:

     
    <string name="default_notification_channel_id">default</string>
    

    之后,您将能够使用新版本的 NotificationCompat.Builder 构造函数,带有2个参数(因为在Android Oreo中不推荐使用带有1个参数的旧构造函数):

     
    private void sendNotification(String title, String body) {
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pi = PendingIntent.getActivity(this,
                0 /* Request code */,
                i,
                PendingIntent.FLAG_ONE_SHOT);
    
        Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, 
            getString(R.string.default_notification_channel_id))
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setSound(sound)
                .setContentIntent(pi);
    
        NotificationManager manager = 
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
        manager.notify(0, builder.build());
    }
    
        
    19
    2018-03-30 15:29:39Z
    1. 这怎么这么简单? :S
      2019-01-20 01:57:39Z
    2. 醇>

    以下是示例代码,该代码适用于Android Oreo且低于Oreo。

     
      NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationCompat.Builder builder = null;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                    int importance = NotificationManager.IMPORTANCE_DEFAULT;
                    NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance);
                    notificationManager.createNotificationChannel(notificationChannel);
                    builder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId());
                } else {
                    builder = new NotificationCompat.Builder(getApplicationContext());
                }
    
                builder = builder
                        .setSmallIcon(R.drawable.ic_notification_icon)
                        .setColor(ContextCompat.getColor(context, R.color.color))
                        .setContentTitle(context.getString(R.string.getTitel))
                        .setTicker(context.getString(R.string.text))
                        .setContentText(message)
                        .setDefaults(Notification.DEFAULT_ALL)
                        .setAutoCancel(true);
                notificationManager.notify(requestCode, builder.build());
    
        
    14
    2017-11-16 10:13:08Z

    简单样本

     
        public void showNotification (String from, String notification, Intent intent) {
            PendingIntent pendingIntent = PendingIntent.getActivity(
                    context,
                    Notification_ID,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );
    
    
            String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);
    
                // Configure the notification channel.
                notificationChannel.setDescription("Channel description");
                notificationChannel.enableLights(true);
                notificationChannel.setLightColor(Color.RED);
                notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
                notificationChannel.enableVibration(true);
                notificationManager.createNotificationChannel(notificationChannel);
            }
    
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
            Notification mNotification = builder
                    .setContentTitle(from)
                    .setContentText(notification)
    
    //                .setTicker("Hearty365")
    //                .setContentInfo("Info")
                    //     .setPriority(Notification.PRIORITY_MAX)
    
                    .setContentIntent(pendingIntent)
    
                    .setAutoCancel(true)
    //                .setDefaults(Notification.DEFAULT_ALL)
    //                .setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                    .build();
    
            notificationManager.notify(/*notification id*/Notification_ID, mNotification);
    
        }
    
        
    6
    2018-01-30 12:32:42Z
     
    Notification notification = new Notification.Builder(MainActivity.this)
            .setContentTitle("New Message")
            .setContentText("You've received new messages.")
            .setSmallIcon(R.drawable.ic_notify_status)
            .setChannelId(CHANNEL_ID)
            .build();  
    

    正确的代码是:

     
    Notification.Builder notification=new Notification.Builder(this)
    

    具有依赖关系26.0.1和新更新的依赖关系,例如28.0.0。

    有些用户以此形式使用此代码:

     
    Notification notification=new NotificationCompat.Builder(this)//this is also wrong code.
    

    因此逻辑是您将声明或初始化的方法,然后右侧的相同方法将用于分配。如果在Leftside中=你将使用某种方法,则在=的右侧使用相同的方法进行新的分配。

    试试这段代码......一定会有效

        
    2
    2018-05-26 14:19:33Z

    在API级别26.1.0中不推荐使用此构造函数。 请改用NotificationCompat.Builder(Context,String)。所有发布的通知都必须指定NotificationChannel ID。

        
    1
    2018-05-04 06:38:26Z
    1. 或许宁可添加带有文档链接的注释,而不是复制cat和发布作为答案。
      2018-10-04 14:58:36Z
    2. 醇>
来源放置 这里