前言

  根据《第一行代码 第二版》第八章中通知的写法,在我自己手机上调试的时候没有任何反应。
查阅资料后发现,因为我的手机系统是MIUI10.3版本,为Android 9系统,而在Android 8系统上对通知进行了修改,引入了消息通道 (Notification Channel) 的使用。目的是为了方便不同信息的管理与分类,提高用户体验。

创建通知

  一个打的不同就是NotificationCompat.Builder中,只有一个Context参数的构造方法已经被标为过时,而另一个构造 方法需要传入一个 channelID 的字符串参数:

Android 13通知_Java

  • 这个channelID就是一个消息通道的唯一ID名称
  • 其他的还是像以前一样连缀方法最后Build

建立消息通道

  如果想要通知正常的显示出来,那就需要一个能收纳该信息的信息通道,需要两个步骤:

  • 创建消息通道
  • 提交给通知管理器

创建消息通道:

//id 就是上面创建消息需要的消息通道的ID
//name 是该消息通道的名称
//最后一个参数是该消息通道的重要性
NotificationChannel channel=new NotificationChannel("id","name",NotificationManager.IMPORTANCE_HIGH);
channel.enableLights(true);//允许呼吸灯闪烁
channel.setDescription("describe");//设置该通道的描述
channel.setLightColor(Color.RED);
//当然还可以再使用其他方法

  最后一个参数目前只能在NotificationManager类取IMPORTANCE_NONE-IMPORTANCE_HIGH,对应0-4几个取值(MAX不能用),最高的HIGH会像QQ微信一样出横幅,前提是用户设置了允许。

当然Notification里的setPriority方法也被标记为了过时(上面的消息通道重要性参数取代了该方法):

Android 13通知_Android_02


  一样的还有设置震动也是需要在消息通道里设置,在Builder中的方法也被标为过时

提交给通知服务:
  这步很简单:

NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//获取消息服务
manager.createNotificationChannel(channel);//创建消息通道

使用通知

Notification notification=new Notification.Builder(this,"id")
        .setContentTitle("Title")
        .setContentText("This is Content")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.mipmap.ic_launcher)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_round))
        .build();
manager.notify(55520,notification);

效果

打开程序:

Android 13通知_Notification Channel_03


状态栏:

Android 13通知_消息通道_04


在手机的消息管理设置里可以看到一个app的所有消息通道:

Android 13通知_Java_05


用户可以设置每一个消息通道的权限:

Android 13通知_消息通道_06


注意这里如果打开悬浮通知并且消息通道重要性设置最高(HIGH)就会有下图的效果:

Android 13通知_Notification Channel_07


最后贴两张QQ的消息管理设置(MIUI10默认的):

Android 13通知_Android 13通知_08


Android 13通知_消息通道_09