首先,对于Android8.0以上版本系统的通知功能,仅仅靠NoticeficationCompat.Builder已经不能实现了,因为8.0以后引入了一个通道的概念---NotificationChannel.如果在8.0以上系统没有使用通道的概念,你将会发现有好多属性即使build()了,但是仍然不起作用。所以一定要重视通道如何使用。

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

实现通知栏功能,需要两个类Notification和NotificationManager两个类

NotificationManager:主要负责状态栏通知的管理类,负责发通知、清除通知。

代码中用到的相关的属性和方法

PendingIntent(表示一个在将来某个待定的时刻发生,而Intent是立刻发生)位标识符:

FLAG_ONE_SHOT:  返回的PendingIntent只能够执行一次,执行完成后就会自动消除。

FLAG_NO_CREATE: 如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL

FLAG_CANCEL_CURRENT:   相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent,这个有利于数据保持为最新的,可以用于即时通信的通信场景

FLAG_UPDATE_CURRENT:     更新的PendingIntent

通知栏的优先级:

Notification.PRIORITY_DEFAULT:默认优先级用于没有特殊优先级分类的通知

Notification.PRIORITY_HIGH:高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。

Notification.PRIORITY_LOW:低优先级可以通知用户但又不是很紧急的事件

Notification.PRIORITY_MAX:重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的

Notification.PRIORITY_MIN:用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。

常用方法的简单介绍

(1)setDefault(int defaults)   此方法的功能:向通知添加声音、闪灯和振动效果的最简单、使用默认(defaults)属性,也可以组合多个属性。

其对应属性包括:

Notification.DEFAULT_VIBRATE: 添加默认震动提醒
Notification.DEFAULT_SOUND:   添加默认声音提醒

Notification.DEFAULT_LIGHTS:   添加默认三色灯提醒(需要相关的硬件支持)
Notification.DEFAULT_ALL:         添加默认以上3种全部提醒

注意:添加震动时,需要添加相应的权限:<uses-permission android:name="android.permission.VIBRATE" />

(2)简单介绍一下Flags:提醒标志符,向通知添加声音、闪灯和振动效果等设置达到通知提醒效果,可以组合多个属性

其中成员包括:

Notification.FLAG_SHOW_LIGHTS:三色灯提醒,在使用三色灯提醒时候必须加该标志符

Notification.FLAG_ONGOING_EVENT:发起正在运行事件,在活动中

Notification.FLAG_INSISTENT:让声音、振动无限循环,直到用户响应 ,取消或者打开

Notification.FLAG_ONLY_ALERT_ONCE:发起Notification后,铃声和震动均只执行一次

Notification.FLAG_AUTO_CANCEL:用户单击通知后自动消失

Notification.FLAG_NO_CLEAR:只有全部清除时,Notification才会清除 ,不清楚该通知,QQ的通知无法清除,就是用的这个

Notification.FLAG_FOREGROUND_SERVICE:表示正在运行的服务

具体代码如下:

    @TargetApi(Build.VERSION_CODES.O)private void sendSubscriMsg() {String channelId = "1";//消息通道的ID,以后可以通过该ID找到该消息通道String channelName = "订阅消息";//消息通道的名字Intent intent = new Intent(this, MainActivity.class);int flag = PendingIntent.FLAG_UPDATE_CURRENT;PendingIntent contentIntent = PendingIntent.getActivity(this, 3, intent, flag);//新建一个消息通道NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);//获取系统提供的通知管理服务NotificationManager manager = (NotificationManager) this.getSystemService(this.NOTIFICATION_SERVICE);manager.createNotificationChannel(channel);Notification notification = new Notification.Builder(this).setContentIntent(contentIntent)//设定点击通知之后启动的内容.setContentTitle("收到一条订阅消息")//创建通知的标题.setContentText("地铁沿线30万商铺抢购中!")//创建通知的内容.setWhen(System.currentTimeMillis())//设定通知栏显示的时间.setSmallIcon(R.drawable.ic_launcher_background)//创建通知的小图标//使用系统默认的震动参数,会与自定义的冲突.setDefaults(Notification.DEFAULT_ALL).setVibrate(new long[]{0, 100, 500, 700}).setTicker("测试通知来了").setPriority(Notification.PRIORITY_DEFAULT)//设置通知栏的优先等级.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_background))//创建通知栏大图标.setContent(getRemoteViews())//自定义通知栏的布局.setAutoCancel(true)//设定点击通知之后通知是否消失.setChannelId("1")//设置通道.build();//发送通知请求manager.notify(2, notification);}public PendingIntent getDefaultIntent(int flags) {Intent intent = new Intent(this, MainActivity.class);intent.putExtra("cmd", flags);int flag = PendingIntent.FLAG_UPDATE_CURRENT;PendingIntent pendingInt = PendingIntent.getActivity(this, 1, new Intent(), flag);return pendingInt;}

由于我在代码中已经写了详细的注释,我就不对每个属性再做阐述,只对一些我认为,比较重点知识做一下讲解,如有其他问题请在下方给我评论,或者联系我(2422040403@qq.com)进行详细的探讨。

自定义通知栏的布局,需要使用RemoteViews类,此类在自定义视图布局文件中支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些控件,但是不支持其子类或者其他的安卓控件,如果有使用这些范围以外的控件,怎会报ClassNotFoundException异常。

具体代码如下:

//自定义通知栏布局public RemoteViews getRemoteViews() {Calendar calendar=Calendar.getInstance();//获取系统时间int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);//构建字符串StringBuilder s=new StringBuilder();s.append(hour).append(":").append(minute).append(":").append(second);RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_layout);remoteViews.setTextViewText(R.id.tv_weather_case, "今天天气晴,温度10℃,请注意保暖  " + s);remoteViews.setImageViewResource(R.id.iv_notification_icon, R.drawable.weather);remoteViews.setOnClickPendingIntent(R.id.ll_Notification_Weather, getDefaultIntent(3));return remoteViews;}

这两段代码我写的也比较简单,没有再添加任何其他的功能,希望大家能认真看一下我写的代码,就能实现一个通知的功能,如果有什么问题,或者认为我代码有什么问题的及时联系我(242204040@qq.com)

Android8.0通知功能的实现方法相关推荐

  1. 小米android8.0新功能,性能大优化:小米A1已向所有用户推Android 8.0更新

    近日,小米方面发布消息表示,已经正式向所有的小米A1手机用户推送Android 8.0系统更新,用户在检查更新当中就可以直接OTA升级,与其一起推送的还有一月的安全补丁. 此次的更新推送不仅修复了此前 ...

  2. 小米android8.0新功能,性能大优化:小米A1已向所有用户推Android 8.0更新!

    原标题:性能大优化:小米A1已向所有用户推Android 8.0更新! 近日,小米方面发布消息表示,已经正式向所有的小米A1手机用户推送Android 8.0系统更新,用户在检查更新当中就可以直接OT ...

  3. android8.0画中画功能,支持画中画功能:华为Mate 9运行安卓8.0亮相

    [TechWeb报道]华为一直和谷歌保持着合作关系,比如之前谷歌Nexus 6P就参与了代工.所以华为旗下手机在Android最新系统适配工作上就非常及时.此前无论是华为Mate8,还是华为P9,都在 ...

  4. 小米android8.0新功能,小米6搭载安卓8.0终于来了 多任务界面风格大变

    ­ 早在8月份,谷歌就发布了安卓8.0正式版系统.不过由于国内的定制系统与原生安卓区别较大,所以国内机型适配安卓8.0需要时间. ­ 经过一段时间的等待,搭载安卓8.0的小米6终于来了.11月末,小米 ...

  5. Android之解决Android8.0手机(Notification)收不到自定义消息通知以及其它手机得到数据不同步

    1 问题 app,自定义消息通知的时候,在Android8.0手机上收不到通知 2 解决办法 NotificationManager需要创建NotificationChannel,然后调用create ...

  6. android6.0.1隐藏功能,安卓6.0系统界面调谐器怎么使用?安卓6.0隐藏功能开启和使用方法[多图]...

    安卓6.0推送有一段时间了,很多用户对其新增功能还不太了解吧!今天友情下载小麦给大家带来的是安卓6.0隐藏功能开启和使用方法,希望可以帮到大家,现在就跟随小麦一起看看吧!!! 要开启安卓6.0的隐藏功 ...

  7. 一加5t升级android8.0,一加5/5T升级Android8.0 这些强大的功能用起来太爽了!

    原标题:一加5/5T升级Android8.0 这些强大的功能用起来太爽了! 众所周知,一加在系统版本更新方面非常积极,更新Android版本不仅能够增加系统的功能,在安全性,稳定性,流畅性等各方面都会 ...

  8. android 9.0 屏蔽系统所有通知功能实现

    目录 1.概述 2.屏蔽系统所有通知功能实现的核心类 3.屏蔽系统所有通知功能实现的核心功能实现和分析

  9. Android 8.0 学习(14)---Android8.0适配分析

    公司项目Android8.0适配分析 1. 官方推荐的兼容测试方式  2. Android8.0行为变更说明  Android 8.0 行为变更包括两个部分:针对所有 API 级别的应用和针对 And ...

最新文章

  1. 与顶级互联网公司技术大佬面对面聊聊RocketMQ
  2. python将字典导入excel_python将字典列表导出为Excel文件的方法
  3. LeetCode 33 搜索旋转排序数组
  4. 16、17、18_使用gridspec定义多子图,条形图(Bar plots),分组条形图,堆叠条形图(Stacked bar chart),饼图(Pie plots),甜甜圈图,嵌套饼图
  5. ASP.NET2.0_多语言本地化应用程序
  6. 《看聊天记录都学不会C语言?太菜了吧》(13)(9*9 乘法表)寻找电脑中的盲盒彩蛋
  7. P2633-Count on a tree【主席树,LCA】
  8. ***PHP 去除换行符
  9. VC6.0的工程设置解读Project--Settings
  10. 剑指offer——面试题37:两个链表的第一个公共结点
  11. java 富文本 xss_Jsoup 防止富文本 XSS 攻击
  12. 2019物联网博览会专业展览会-参加展会我们最专业
  13. 标准正态分布表完整图 查询_正态分布基本概念及Excel实现
  14. 疯狂java讲义第六章课后习题答案
  15. mysql函数思维导图
  16. 厦门大学考研:必知20大时间节点
  17. Unity3D 游戏摄像机的环绕与拉近
  18. 主题黑板.html,黑板报主题
  19. python函数调用键盘热键_Python自定义快捷键,热键,HotKey
  20. Linux - 一次性计划任务之at命令使用

热门文章

  1. 未来计算机dl攻城略地进程
  2. 22_国际短信国家代码sql脚本
  3. 深度学习如何在云服务器中搭建环境
  4. dzzoffice二次开发,支持wps,et格式
  5. Linux系统:第十四章:安装Docker,java面试编译原理
  6. Redis内存淘汰机制
  7. Mysql子查询练习
  8. java中System.Properties的用法
  9. CodeForces - 821C Okabe and Boxes
  10. 无法启动HoloLens Emulator修正