Android 8.0 通知显示

关于通知的属性设置和常见的使用方法可以看我的这篇:Android 通知(使用NotificationCompat.Builder )当时是依照Android 7.0写的博文,发现在Android 8.0上无法弹出,这里做出适配Android O通知的总结。

区别与Android 7.0,需要为通知添加渠道:NotificationChannel。
先上代码举例:

 final String CHANNEL_ID = "channel_id_1";
        final String CHANNEL_NAME = "channel_name_1";

  NotificationManager mNotificationManager = (NotificationManager)
   getSystemService(Context.NOTIFICATION_SERVICE);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        //只在Android O之上需要渠道
            NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID,
                    CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
                    //如果这里用IMPORTANCE_NOENE就需要在系统的设置里面开启渠道,
                    //通知才能正常弹出
            mNotificationManager.createNotificationChannel(notificationChannel);
        }
        NotificationCompat.Builder builder= new NotificationCompat.Builder(this,CHANNEL_ID);


        builder.setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("通知标题")
                .setContentText("通知内容")
                .setAutoCancel(true);

        mNotificationManager.notify(notificationId, builder.build());

调用以上代码可以在Android O上显示一则通知。
需要注意的是,渠道是向系统注册的,类似申请权限,注册过的渠道在设置里面都会看见,即使代码改变,再次运行,上次注册的渠道依然会在设置里,除非清除数据或者卸载重装应用。
渠道使用至少有三个步骤:
1.渠道的初始化(构造方法需要三个参数):

NotificationChannel(String id, CharSequence name, int importance)

id:渠道id,每个packege中应该是唯一的,如果太长,该值可能被截断
name:用户可见的渠道名称,可重命名,如果太长,该值可能被截断
importance:用于表示渠道的重要程度。这可以控制发布到此频道的中断通知的方式。有以下6种重要性,是NotificationManager的静态常量,依次递增:
IMPORTANCE_UNSPECIFIED(值为-1)意味着用户没有表达重要性的价值。此值用于保留偏好设置,不应与实际通知关联。
IMPORTANCE_NONE(值为0)不重要的通知:不会在阴影中显示。
IMPORTANCE_MIN(值为1)最低通知重要性:只显示在阴影下,低于折叠。这不应该与Service.startForeground一起使用,因为前台服务应该是用户关心的事情,所以它没有语义意义来将其通知标记为最低重要性。如果您从Android版本O开始执行此操作,系统将显示有关您的应用在后台运行的更高优先级通知。
IMPORTANCE_LOW(值为2)低通知重要性:无处不在,但不侵入视觉。
IMPORTANCE_DEFAULT (值为3):默认通知重要性:随处显示,产生噪音,但不会在视觉上侵入。
IMPORTANCE_HIGH(值为4)更高的通知重要性:随处显示,造成噪音和窥视。可以使用全屏的Intent。
2.将渠道添加到NotificationManager
使用NotificationManager的createNotificationChannel方法

void createNotificationChannel (NotificationChannel channel)

3.builder的构造方法使用有两个参数的那一个

NotificationCompat.Builder(Context context, String channelId)

注意:channelId使用跟第一步一样的id
如上添加三步,适配Android 8.0通知的新特性,让通知成功出现。
*4.渠道的属性设置


// 配置通知渠道的属性
notificationChannel .setDescription("渠道的描述");
// 设置通知出现时的闪灯(如果 android 设备支持的话)
notificationChannel .enableLights(true);
notificationChannel .setLightColor(Color.RED);
// 设置通知出现时的震动(如果 android 设备支持的话)
notificationChannel .enableVibration(true);
notificationChannel .setVibrationPattern(new long[]{1000, 2000, 1000,3000});
//如上设置使手机:静止1秒,震动2秒,静止1秒,震动3秒

用户可以在设置里面阻止或允许应用通知,渠道名称和属性在设置里是可以看的,如下图:

应用通知的详情 应用渠道的详情
这里写图片描述 这里写图片描述

用户可以修改渠道的优先级

这里写图片描述

猜你喜欢

转载自blog.csdn.net/htwhtw123/article/details/79838742