Android Notification通知的总结(兼容8.0+和8.0以下)

 

        先上视频效果,左边是提醒式通知(弹横幅),右边是普通通知,通过Demo上的按键触发,解析一段写好的json拿到通知要显示的数据,然后弹notification:

Android Notification通知的总结(兼容8.0+和8.0以下)_第1张图片     Android Notification通知的总结(兼容8.0+和8.0以下)_第2张图片

       有如下需要注意的几个关键点:

       1.从Android 8.0(API级别26)开始,必须将所有通知分配给一个通道(channel),否则将不会收到通知, 处理Notification的逻辑部分,必然会分为两部分去写:8.0以下的写法和8.0+的写法。封装好的Notification核心函数:

 private static void popNotification(Context context, String contentTitle, String message, Bitmap thumbnail, int requestCode, Intent intent, int notificationId) {
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            HeadsUpManager headsUpManager = HeadsUpManager.getInstant(context);
            HeadsUp.Builder builder = new HeadsUp.Builder(context)
                    .setContentTitle(contentTitle)
                    .setSmallIcon(R.mipmap.cat_icon)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setPriority(Notification.PRIORITY_MAX)  //default不弹横幅,只有max弹横幅
                    .setContentText(message);
            if (thumbnail != null) {
                NotificationCompat.BigPictureStyle pictureStyle = new NotificationCompat.BigPictureStyle();
                pictureStyle.bigPicture(thumbnail);
                builder.setStyle(pictureStyle);
            }
            headsUpManager.notify(notificationId, builder.buildHeadUp());
        } else {
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel channel = new NotificationChannel(PUSH_CHANNEL, PUSH_CHANNEL, NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(channel);
            Notification.Builder builder = new Notification.Builder(context, PUSH_CHANNEL);
            builder.setContentTitle(contentTitle);
            builder.setSmallIcon(R.mipmap.cat_icon);
            builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.cat_icon));
            builder.setAutoCancel(true);
            builder.setContentIntent(pendingIntent);
            builder.setContentText(message);

            if (thumbnail != null) {
                Notification.BigPictureStyle pictureStyle = new Notification.BigPictureStyle();
                pictureStyle.bigPicture(thumbnail);
                builder.setStyle(pictureStyle);
            }
            notificationManager.notify(1, builder.build());
        }
    }

        2.关于notification 优先级的官网论述如下图所示,可见设置成最高优先级的消息在通知到来的时候就会弹出横幅(head up),其他的优先级则会仅仅在通知栏里显示,不会有弹出提醒:

Android Notification通知的总结(兼容8.0+和8.0以下)_第3张图片

       截图里最后一行:“用户可以随时更改应用程序频道的设置”的意思就是在应用的「通知」-> 行为去修改,修改通知的优先级。位置如下截图所示:

                                     Android Notification通知的总结(兼容8.0+和8.0以下)_第4张图片

3. 关于8.0+的 NotificationChannel, 如果代码中有多个位置使用了NotificationChannel的构造函数,但是在「通知」中还只想看到仅有1个Notification通道,那么必须保证new NotificationChannel()构造函数的第一个参数id是一样的,id只要一样就会保证只有一个通道,至于具体NotificationChannel最后会叫啥名,要看最后一个构造函数的name参数传的是啥。

 

  封装的Demo已上传:https://download.csdn.net/download/Crystal_xing/11986362

  github:https://github.com/crystalyf/notificationDemo

 

你可能感兴趣的:(android)