Android 消息通知栏用法详解(二) 适配8.0

8.0 以下的通知栏讲解,请参考:
Android 消息通知栏用法详解(一)

上篇中,我们学习了8.0 以下的 通知栏常用用法。但8.0之后,google 又引入了 channel 的概念来管理通知栏,避免一拿起手机一大堆通知占着屏幕,谁看谁难受。

什么是channel 呢,意思就是每条通知都对应一个channel,每个 app 都能创建,但这些管理管理权限又都在用户手上。现在让我们一起来学习一下,如何适配 8.0 吧。

一、 适配8.0

如果要适配 Android 8.0 ,还需要添加 NitificationChannel,根据文档,我们可以这样写:


String CHANNEL_ID = "chat";
    //适配8.0
    if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.O){
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                "聊天信息",
                NotificationManager.IMPORTANCE_DEFAULT);
        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(channel);
    }

NotificationChannel 有三个参数是必填的。

  • id : channel_id,这个是channel 的唯一标识
  • name : 在 appinfo 中给用户看的
  • importance : 重要程度,这里选择默认的即可

这段代码写在哪里都行,只有在 mannager.notiify() 之前即可,以后每次创建代码系统都会去检测该通知的通道是否存在了,因此不会重复创建。

同样,因为上面的属性,当我们设置完channel之后,下次如果想修改一些属性,比如震动、声音,就需要先删掉这个 channel_id,重新创建才会生效。不然 系统会把它重新捞起来,你设置的属性并没有成功。你可以直接删掉或者改 channel_id 也可以的。

接着说说 importance ,它的常见4个优先级如下:

  • MPORTANCE_HIGH :紧急,发出提示音,并以浮动通知的形式显示,让用户立即看到
  • IMPORTANCE_DEFAUL:高,发出提示音
  • IMPORTANCE_LOW:中,不发出提示音
  • IMPORTANCE_MIN:最小,不发出提示音,且不会在状态栏显示

这样,最终我们的代码修改为

  mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  String CHANNEL_ID = "chat";
  //适配8.0
  if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.O){
      NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
              "聊天信息",
              NotificationManager.IMPORTANCE_DEFAULT);
      NotificationManager manager = getSystemService(NotificationManager.class);
      manager.createNotificationChannel(channel);
  }

  /**
   * 注意写上 channel_id,适配8.0,不用担心8.0以下的,找不到 channel_id 不影响程序
   */
  mBuilder = new NotificationCompat.Builder(this,CHANNEL_ID)
          .setContentTitle("这是标题")
          .setContentText("我是内容,我是demo")
          .setWhen(System.currentTimeMillis())
          .setSmallIcon(R.mipmap.ic_launcher)
          .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
  //通过 builder.build() 拿到 notification
  mNotificationManager.notify(1, mBuilder.build());

也可以通过

 channel.setDescription("需要开启此权限才能与他人聊天");

设置 channel 的描述信息。

可以看到,在 8.0 的手机上显示出来了。如何知道,channel 的信息呢,长按app 的图标,进入 appInfo,找到 notification 就可以看到了:
在这里插入图片描述

二、设置渠道

上面说到,渠道一旦设置了,用户有权去改动它,比如关闭声音通知,那我们怎么知道呢?

如果想了解用户对您的通知渠道所应用的设置,请按以下步骤操作:

  1. 通过调用 getNotificationChannel() 或 getNotificationChannels() 获取 NotificationChannel 对象。
  2. 查询特定的渠道设置,例如 getVibrationPattern()、getSound() 和 getImportance()。

比如,我们把刚才聊天的通知,长按关闭。
在这里插入图片描述
接着,我们使用 getImportance() 拿到 它的importance。

 NotificationChannel channel = mNotificationManager.getNotificationChannel(CHANNEL_ID);
 int importance = channel.getImportance();

当检测到 用户关闭时,可以通过 ACTION_CHANNEL_NOTIFICATION_SETTINGS 操作的 Intent 打开通知渠道的系统设置。如:

 //如果被关闭了,
 if (importance == NotificationManager.IMPORTANCE_NONE) {
     Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
     intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
     intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
     startActivity(intent);
 }

如:
在这里插入图片描述

删除渠道

可以通过调用 deleteNotificationChannel() 删除通知渠道。
注意:通知设置屏幕会显示已删除渠道的数量,以此作为一项垃圾内容防范机制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章