Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

2017-03-24 00:37:33

Android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。

下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等。

(网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头,随便当作回顾笔记。下面我就通过官方文档、源代码、书上的一些资料汇总下这一块的知识,并通过一个通知栏的汇总DEMO让大家更好的了解这个类的使用,内容有点多,可以根据需求看目录学习)。


Notificaiton状态通知栏:


功能作用


1.显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)  
2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等) 
3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)


思维导图结构


思维导图的大体结构(按照各个节点延伸拓展学习)

Notificaiton -- service   -- BroadcastReceiver  -- Intent(flag、Action等属性应用) --  PendingIntent

感慨:

一个Notificaiton通知的拓展使用就要涉及与4大组建的配合,所以学好整体的知识体系。

联系:

1.由于service 是在后台运行,所以它意图做什么我们看不到,可以通过Notificaiton 来显示提醒(如音乐的后台播放)。

2.service服务和BroadcastReceiver广播相结合,在加上Notificaiton 显示(如程序的后台更新)。

3.Intent作为意图处理,和Notificaiton的点击时间紧密结合在了一起,并且与BroadcastReceiver和service的联系也紧密不可以分割

(service 在后台之后通过BroadcastReceiver来通知Notificaiton 显示相关东西,在通过Intent完成用户的意图操作

相关文档:Activity启动模式 及 Intent Flags 与 栈 的关联分析


对应的官方链接

设计文档 :   

官方:http://developer.android.com/design/patterns/notifications.html

译文:http://adchs.github.io/patterns/notifications.html

使用教程 :http://developer.android.com/training/notify-user/index.html 

开发文档 :http://developer.android.com/reference/android/app/Notification.html



大体了解


Notification支持文字内容显示、震动三色灯铃声等多种提示形式,在默认情况下,Notification仅显示消息标题消息内容送达时间这3项内容。以下就是通知的基本布局。

通知的基本布局

普通视图:


高度64dp

大试图的通知在展开前也显示为普通视图


元素:

1. 标题   Title/Name

2大图标  Icon/Photo

3内容文字   

4内容信息   MESSAGE

5小图标 Secondary Icon

6通知的时间 Timestamp,默认为系统发出通知的时间,也可通过setWhen()来设置



相关分析


状态通知栏主要涉及到2个类:  Notification 和 NotificationManager 

Notification为通知信息类,它里面对应了通知栏的各个属性

NotificationManager :  是状态通知的管理类,负责发通知、清除通知等操作。

注意:NotificationManager 是一个系统Service,所以必须通过 getSystemService(NOTIFICATION_SERVICE)方法来获取,方法如下。

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  



使用步骤:


流程模块:

第一步:

创建一个通知栏的Builder构造类  (Create a Notification Builder)

第二步:

定义通知栏的Action  (Define the Notification's Action)

第三步:

设置通知栏点击事件    (Set the Notification's Click Behavior)

第四步:

通知   (Issue the Notification)


代码模块:


实现系统默认的通知栏效果:

第一步:获取状态通知栏管理:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  


第二步:实例化通知栏构造器NotificationCompat.Builder:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);  


第三步:对Builder进行配置:


[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. mBuilder.setContentTitle("测试标题")//设置通知栏标题  

  2.     .setContentText("测试内容") /<span style="font-family: Arial;">/设置通知栏显示内容</span>  

  3.     .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图  

  4. //  .setNumber(number) //设置通知集合的数量  

  5.     .setTicker("测试通知来啦"//通知首次出现在通知栏,带上升动画效果的  

  6.     .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间  

  7.     .setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级  

  8. //  .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消    

  9.     .setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)  

  10.     .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合  

  11.     //Notification.DEFAULT_ALL  Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission  

  12.     .setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON  


对应的各个方法的属性(部分方法以上代码中已经作注释,就不再介绍):



(1)方法:设置提醒标志符Flags


功能:提醒标志符,向通知添加声音、闪灯和振动效果等设置达到通知提醒效果,可以组合多个属性

有2种设置方法:

1.实例化通知栏之后通过给他添加.flags属性赋值。


[java] view plain copy 在CODE上查看代码片派生到我的代码片

    • 2019-05-18 12:37:39

      Android夜间模式的实现方案

      对于一款阅读类的软件,夜间模式是不可缺少的。最初看到这个需求时候觉得无从下手,没有一点头绪。后来通过查阅资料发现Android官方在Support Library 23.2.0中已经加入了夜间主题。也就是只需要通过更换主题便可实现日间模式和夜间模式的切换。下面截取项目实现的夜间模式效果图:

    • 2019-05-18 12:38:41

      android 快速实现夜间模式

      最近项目中遇到了一个问题,夜间模式在8.0以上的手机中不起作用,查看了一下原因,是夜间模式实现方法的问题。分两种情况介绍一下

    • 2019-05-18 12:40:35

      Android夜间模式的几种实现

      通过增加一层遮光罩来实现。效果不是很理想,但是好用,毕竟很多手机都有自己的夜间模式了

    • 2019-05-19 02:25:15

      php使用TCPDF生成PDF文件教程

      orientation属性用来设置文档打印格式是“Portrait”还是“Landscape”。 Landscape为横式打印,Portrait为纵向打印

    • 2019-05-21 11:46:05

      RecyclerView 加动画的坑

      然后加到recyclerView上,我是在adapter上加的。Adapter的holder复用相信大家也都很熟悉了,这个在绘制效率的提高上很重要,也很容易发现一个问题,就是内容混乱的复用。所以常见的处理就是对view加上tag来多次判断,对于visibility之类的设置一定是if...else的写法,光有if是不可以的。

    • 2019-05-21 11:54:10

      Android中如何设置字体大小

      首先要强调一点,某些用户可能存在视力障碍甚至几近失明,他们无法顺利阅读一般尺寸下的文字内容。Android操作系统意识到了这些情况,并提供了一套显示辅助功能,使得用户可以根据自己的使用习惯随意缩放设备中文本字体的大小。 要在设备上修改字体设定,首先启用“设定”应用,然后选择“显示”项下的“字体尺寸”。用户可以在设备预置的四种文本字体尺寸中选择适合自己的方案(包含小、正常、大、超大),详见图一。

    • 2019-05-21 12:34:38

      浅谈Recycleview嵌套卡顿 以及你所不知道的解决方案

      由于项目需要,需要做到recycleview 这里先不讲如何用其他控件代替这种嵌套的方式 先假定你已经嵌套了 老板还不给时间给你给布局方式 那么这个时候你的这个嵌套列表 必定是卡顿的 只要超过一屏,展示效果会有卡顿现象,原因就是由于两个RecyclerView的存在,使得滑动的view滑出当前屏幕的释放存在冲突

    • 2019-05-21 12:35:54

      RecyclerView setHasFixedSize(true)的意义

      设置为true,再调用notifyDataSetChanged(),发现大小重新计算了,看来理解出现错误了。还是再看一下哪些地方用到这个mHasFixedSize吧。

    • 2019-05-21 12:37:34

      RecyclerView 刷新闪烁

      闪烁是 notifyDataSetChange 造成的。由于适配器不知道整个数据集中的哪些内容已经存在,在重新匹配 ViewHolder 时发生的。 当然,遇到这个问题时有去搜索一些答案,看到的很多都是去禁止 RecycleView 的默认动画,可惜这对我没什么用。下面的方法是对我有用的。