消息渠道

Google为什么要引入消息渠道这个,因为在之前版本的Android通知管理中,通知消息要么全部接收,要么全部屏蔽,然而消息渠道改变了这一特点。

就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。

以小米手机上的微信为例

API介绍

不带 channelId 已被废弃,慎用!!!

当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。因此这里给大家的建议就是,一定要适配。

创建通知渠道

package com.wust.notifydemo;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initNotificationChannel();}/*** 初始化消息渠道*/private void initNotificationChannel() {// 要确保的是当前手机的系统版本必须是Android 8.0系统或者更高,// 因为低版本的手机系统并没有通知渠道这个功能,// 不做系统版本检查的话会在低版本手机上造成崩溃。if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {// 创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数// 渠道ID可以随便定义,只要保证全局唯一性就可以String channelId = "chat";// 渠道名称是给用户看的,需要能够表达清楚这个渠道的用途String channelName = "聊天消息";// 重要等级的不同则会决定通知的不同行为,重要等级还可以设置为IMPORTANCE_LOW、IMPORTANCE_MIN,分别对应了更低的通知重要程度。int importance = NotificationManager.IMPORTANCE_HIGH;createNotificationChannel(channelId, channelName, importance);channelId = "subscribe";channelName = "订阅消息";importance = NotificationManager.IMPORTANCE_DEFAULT;createNotificationChannel(channelId, channelName, importance);}}@TargetApi(Build.VERSION_CODES.O)private void createNotificationChannel(String channelId, String channelName, int importance) {// 创建 channelNotificationChannel channel = new NotificationChannel(channelId, channelName, importance);// 获取 notificationManagerNotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 注册 channelnotificationManager.createNotificationChannel(channel);}
}

运行代码,可以在 对应应用的 应用信息 =》 通知管理  =》 通知类别下看到我们创建的两个 channel ,效果如下:

刚才我们创建的两个通知渠道这里已经显示出来了。可以看到,由于这两个通知渠道的重要等级不同,通知的行为也是不同的,聊天消息可以发出提示音并在屏幕上弹出通知,而订阅消息只能发出提示音。

当然,用户还可以点击进去对该通知渠道进行任意的修改,比如降低聊天消息的重要等级,甚至是可以完全关闭该渠道的通知。

至于创建通知渠道的这部分代码,你可以写在MainActivity中,也可以写在Application中,实际上可以写在程序的任何位置,只需要保证在通知弹出之前调用就可以了。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。

发送通知

触发通知的代码和之前版本基本是没有任何区别的,只是在构建通知对象的时候,需要多传入一个通知渠道ID,表示这条通知是属于哪个渠道的。

  • 布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_send_chat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送聊天消息"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/btn_send_subscribe"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送订阅消息"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/btn_send_chat" /></androidx.constraintlayout.widget.ConstraintLayout>
  • 发送消息逻辑
btn_send_chat.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//第一步:获取 NotificationManagerNotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//第二步:创建Notification notification = new NotificationCompat.Builder(MainActivity.this, "chat").setContentTitle("收到一条聊天消息").setContentText("在干嘛呢?").setWhen(System.currentTimeMillis()).setSmallIcon(R.drawable.bb).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bb)).setAutoCancel(true).build();//第三步:发送notificationManager.notify(1, notification);}});btn_send_subscribe.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//第一步:获取 NotificationManagerNotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//第二步:创建Notification notification = new NotificationCompat.Builder(MainActivity.this, "subscribe").setContentTitle("收到一条订阅消息").setContentText("你买的彩票中了2个亿?").setWhen(System.currentTimeMillis()).setSmallIcon(R.drawable.bb).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bb)).setAutoCancel(true).build();//第三步:发送notificationManager.notify(2, notification);}});

管理通知渠道

btn_send_chat.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//第一步:获取 NotificationManagerNotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//第四步:检测 "chat" 这个通道的消息等级if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {NotificationChannel channel = notificationManager.getNotificationChannel("chat");if (channel.getImportance() != NotificationManager.IMPORTANCE_HIGH) {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);Toast.makeText(MainActivity.this, "请手动将通知打开", Toast.LENGTH_SHORT).show();}}//第二步:创建Notification notification = new NotificationCompat.Builder(MainActivity.this, "chat").setContentTitle("收到一条聊天消息").setContentText("在干嘛呢?").setWhen(System.currentTimeMillis()).setSmallIcon(R.drawable.bb).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bb)).setAutoCancel(true).build();//第三步:发送notificationManager.notify(1, notification);}});

测试条件:你将 聊天消息 重要程度 手动设置为 低,当你点击发送聊天消息的时候,代码会引导你设置聊天消息等级

显示未读角标

修改两个地方

第一是在创建通知渠道的时候,调用了NotificationChannel的setShowBadge(true)方法,表示允许这个渠道下的通知显示角标。第二是在创建通知的时候,调用了setNumber()方法,并传入未读消息的数量。

一文彻底玩转Android通知栏消息通知相关推荐

  1. Android 通知栏消息

    通知栏消息是Android的一个最成功的发明,的确给用户带来很好的体验. 主要用到的类有NotificationManager.是用来管理提醒的. 还有PendingIntent用来指定点击后跳转的. ...

  2. android 通知权限设置在哪,Android 打开消息通知权限

    转载自https://blog.csdn.net/rocrocflying/article/details/78333256?locationNum=8&fps=1 和 https://blo ...

  3. Android通知栏介绍与适配总结

    由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知栏玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更 ...

  4. android 华为推送通知中心,华为推送通知栏消息功能及 intent 说明文档

    华为推送分为透传推送和通知栏推送两种方式. 两种方式的区别如下: 透传推送:华为推送服务会将原始 json 数据发给目标客户端,客户端内嵌的融云 SDK 接受到该 json 数据后,会进行解析并在通知 ...

  5. 实现Android的消息通知栏

    背景知识:可以用Activity和Service来开始消息通知,两者的区别在于一个是在前台触发,一个是后台服务触发. 要使用消息通知,必须要用到两个类:NotificationManager和Noti ...

  6. android通知栏设置,android系统通知栏提示消息

    在使用android手机时,大家一定都会接触过系统通知栏提示的消息,如图... 我们在开发android程序时也经常会用到这个技术,先奉上初始化的函数一个 private void initNotif ...

  7. Android之消息通知栏

    一:先来效果图. 二:实现步骤. 1.xml布局实现. <?xml version="1.0" encoding="utf-8"?> <Lin ...

  8. 华为android系统通知栏怎么关闭,华为通知栏怎么设置?三招帮你禁止华为通知栏消息...

    原标题:华为通知栏怎么设置?三招帮你禁止华为通知栏消息 不管是华为.小米还是苹果三星等智能手机,都会有同一个困扰:每天都会接收到不少的推送栏消息,除了系统通知之外,还有各种各样的第三方应用推送消息,十 ...

  9. Java中集成极光推送实现给Android提送消息通知(附代码下载)

    场景 Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...

最新文章

  1. 浏览器及时感知服务端数据变化的方式
  2. datafactory生成mysql数据_测试数据生成工具DataFactory的使用
  3. 接上一篇配置多仓库相关命令
  4. vnc移植_VNC远程控制软件使用说明
  5. 基于javascript的asp数据库操作类,含分页、字符串截取、用户登陆验证[原创]
  6. android微信支付服务端,Android 微信支付返回-1
  7. 炫酷实用 7款jQuery/HTML5图片应用
  8. 特斯拉车祸最新调查结果公布,“自动驾驶”Autopilot又双叒成主角
  9. [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
  10. 人人开源快速搭建脚手架工程
  11. 吴恩达深度学习C4W1(Pytorch)实现
  12. PS-elevenday-铅笔工具(颜色替换)
  13. 什么是数字证书?数字证书在哪办理?
  14. Python实现百度地图、高德地图地理编码及高德地图经纬度坐标转百度地图经纬度坐标
  15. ArcGIS遇到严重的应用程序错误的解决办法
  16. alt+w热键组合无法使用
  17. php64转码,Base64的编码转换方式
  18. 阅读不懂,图书之过——《大话设计模式》创作历程
  19. kafka_2.11 简单使用
  20. sklearn学习-SVM例程总结2(特征选择——单因素方差分析(方差分析anova ))

热门文章

  1. 【技术管理】管理核心五要素 - 学习笔记
  2. Pixhawk---sdlog2应用详解
  3. 御坂坂的c++学习之路(5)
  4. 深圳一公司在开源社区表示“要源码上门自取”,引来百万粉大V突袭公司,结果让人意外!...
  5. 1.mysql 的安装
  6. 超级电视与海信电视争第一,这是一场胜负已定的战争
  7. 南通大学机械院两年来的心得体会(给大一新生的一点建议)
  8. 怎样去除图片水印?教你一个一键去除水印的方法
  9. proteus中继电器怎么找_proteus中这个开关在哪
  10. laravel短信包 easy-sms