android 8.0适配--Notification

Notification基本操作

Notification,是一种具有全局效果的通知,可以在系统的通知栏中显示。我们在使用手机的过程中经常可以收到各种类型的app发送通知。通知主要有以下几个作用

  • 显示接收到短消息、及时消息等信息(如QQ、微信、新浪、短信)
  • 显示客户端的推送消息,如广告、优惠、版本更新、推荐新闻等
  • 显示正在进行的事物,例如:后台运行的程序,如音乐播放进度、下载进度等

下面我介绍下如何在app内发送通知的。大致可以分为以下步骤

  • 获取NotificationManager对象
  • 通过构建者模式创建出Notification对象(Notification.Builder)
  • 发送通知

我们可以通过Notificaiton.Builder设置各种属性,这里我先创建一个最简易的通知,我们只要设置了小图标、标题、文本内容这3个属性便可以成功创建出Notification(这3个属性缺一不可)。当然我们也可以设置通知显示的效果,如响铃、震动等我们也只需在此进行设置即可,这里就不一一介绍。发送一条简易通知具体代码如下

 //获取NotificationManager实例
        NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //通过构建者模式创建Notification,最简易通知只要设置以下3个属性就可以了
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.wechat_small)
                .setContentTitle("这是最简易通知--我是标题")
                .setContentText("只有小图标、标题、内容--我是内容");
        //发送通知,第一个参数为Id开发者可以通过Id对通知进行更新和取消
        notifyManager.notify(2, builder.build());

8.0系统适配

我们在使用手机时,有时候下滑通知栏会发现有大量通知,不胜其烦。好在8.0系统后,Google引入了通知渠道这个概念,也就是说在8.0系统上用户可以自主选择关闭或者开启某类通知。如果你的项目的 targetSdkVersion 是在26或更高以上的版本,通过上面方式发送通知在8.0系统的手机上是收不到的,并且会弹出一条吐司提示channel为空,所以我们要进行适配。
android 8.0适配--Notification_第1张图片

对于通知的适配,在8.0系统就是多了个通知渠道(NotificationChannel),也就是说我们只要在发送通知时,创建通知渠道即可,下面就介绍下如何创建。
首先,创建通知渠道前提就是确保我们的项目targetSdkVersion指定在26或以上的版本。

然后我们在代码中进行通知渠道的创建,其代码的位置只要保证在发送通知前调用即可,你可以在application进行创建,这里我是直接在activity中进行创建的。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。其代码如下

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String channelId = "chat";
            String channelName = "聊天消息";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            createNotificationChannel(channelId, channelName, importance);
            channelId = "subscribe";
            channelName = "订阅消息";
            importance = NotificationManager.IMPORTANCE_DEFAULT;
            createNotificationChannel(channelId, channelName, importance);
        }
      

我们在onCreate方法里面进行手机版本判断,大于等于8.0时则需要创建NotificationChannel,其中createNotificationChannel()方法是进行渠道创建的,代码如下

  /**
     * 8.0以上手机需要构建通知渠道,才能够打开通知栏
     *
     * @param channelId   通知栏id
     * @param channelName 通知栏名
     * @param importance  通知栏级别 例如NotificationManager.IMPORTANCE_HIGH;
     */
    @TargetApi(Build.VERSION_CODES.O)
    public void createNotificationChannel(String channelId, String channelName, int importance) {
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        NotificationManager notificationManager = (NotificationManager) getSystemService(
                NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
    }

这里的代码还是非常简单的,我们先new出NotificaitonChannel对象,然后通过manager进行渠道的创建。NotificaitonChannel创建时我们传入3个参数:通知栏ID,名称和级别。这里我们说明下其中第三个参数–重要等级,主要有这几种级别,每种级别对应显示方式不一样。

  • IMPORTANCE_NONE: 不提示,不展示
  • IMPORTANCE_MIN: 不提示,在通知下拉栏会展示,但是是收起的
  • IMPORTANCE_LOW: 会在状态栏中显示,但不会弹窗,通知下拉栏会展示
  • IMPORTANCE_DEFAULT:会在状态栏中显示,允许有声音提示,但不会弹窗,通知下拉栏会展示
  • IMPORTANCE_HIGH: 会弹窗提示,允许有提示音
  • IMPORTANCE_MAX: 会弹窗提示,允许有提示音,可以使用全屏

接着我们就可以发送一条通知其方式跟之前notification的发送是一样的只不过我们在创建notification的时候需要传入通知渠道Id,这里模拟发送了两条不同渠道的通知,分别对应上面创建的渠道,这样我们就完成了8.0系统通知栏的适配。

//发送一条聊天消息
      findViewById(R.id.btn_notify_chat).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
              Notification notification = new NotificationCompat.Builder(HomeActivity.this, "chat")
                      .setContentTitle("收到一条聊天消息")
                      .setContentText("今天中午吃什么?")
                      .setWhen(System.currentTimeMillis())
                      .setSmallIcon(R.mipmap.ic_launcher)
                      .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                      .setAutoCancel(true)
                      .setDefaults(Notification.FLAG_ONLY_ALERT_ONCE)
                      .build();
              manager.notify(1, notification);
          }
      });
      //发送一条订阅消息
      findViewById(R.id.btn_notify_subcri).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
              Notification notification = new NotificationCompat.Builder(HomeActivity.this, "subscribe")
                      .setContentTitle("收到一条订阅消息")
                      .setContentText("地铁沿线30万商铺抢购中!")
                      .setWhen(System.currentTimeMillis())
                      .setSmallIcon(R.mipmap.ic_launcher)
                      .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                      .setAutoCancel(true)
                      .build();
              manager.notify(2, notification);
          }
      });

android 8.0适配--Notification_第2张图片
最后,经过适配后,8.0系统的用户便可以在设置里面进行通知的管理,关闭了渠道则不会接收到此通知了。如图android 8.0适配--Notification_第3张图片

结束

这里比较简易的介绍如何适配,更具体的使用和适配可以去官网进行补充。谢谢。
参考:
链接1: https://blog.csdn.net/guolin_blog/article/details/79854070
链接2: https://www.cnblogs.com/travellife/p/Android-Notification-xiang-jie.html

你可能感兴趣的:(android 8.0适配--Notification)