安卓开发——Notification(实现状态栏通知)相关知识介绍

一、关于Notification

使用场景:当某个应用处于后台运行时需要提示用户某些信息时,不可能启动Activity,这时使用状态栏通知就非常合适。Notification适用于交互事件的通知,它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等。

1.官网是这样解释Notification的:

A class that represents how a persistent notification is to be presented to the user using the NotificationManager.The Notification.Builder has been added to make it easier to construct Notifications(Notification是一个使用NotificationManager来向用户展示推送消息的类,Notification.Builder能更简单的构建推送)

NotificationManager 是状态栏通知的管理类,负责发通知、清除通知等操作。NotificationManager 是一个系统Service,可通过getSystemService(NOTIFICATION_SERVICE)方法来获取

注:如果APP需要兼容API level 4(即安卓1.6, 点击查看API level与安卓系统对应表),需要使用NotificationCompat.Builder来替代 Notification.Builder,NotificationCompat.Builder可兼容低版本。

2.通知的基本布局

一个Notification传送的信息大概有:
1、一个状态条图标;
2、在拉伸的状态栏窗口中显示带有大标题,小标题,图标的信息,并且有处理该点击事件:比如调用该程序的入口类;
3、闪光,LED,或者震动;

在默认情况下,拉伸的状态栏窗口中显示图标、消息标题、消息内容、送达时间这4 项内容,以下就是通知的基本布局。


1.标题
2.大图标
3.内容文字
4.通知集合的数量
5.小图标
6.通知的时间 ,默认为系统发出通知的时间,也可通过setWhen()来设置

二、举个栗子

本例子实现了普通Notification悬挂式Notification
悬挂式Notification是android5.0新增加的方式, 悬挂式Notification不需要下拉通知栏就直接显示出来,悬挂在屏幕上方并且焦点不变仍在用户操作的界面因此不会打断用户的操作,过几秒就会自动消失,他需要调用setFullScreenIntent来将Notification变为悬挂式Notification
本例已安卓5.0为界线,5.0以上实现悬挂式Notification,5.0以下实现普通Notification,下面的每句代码都有相应的注释。

1.代码

//第一步:实例化通知栏构造器Notification.Builder:
Notification.Builder builder =newNotification.Builder(MainActivity.this);//实例化通知栏构造器Notification.Builder,参数必填(Context类型),为创建实例的上下文
//第二步:获取状态通知栏管理:
NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//获取状态栏通知的管理类(负责发通知、清除通知等操作)
//第三步:设置通知栏PendingIntent(点击动作事件等都包含在这里):
Intent push =newIntent(MainActivity.this,MainActivity.class);//新建一个显式意图,第一个参数 Context 的解释是用于获得 package name,以便找到第二个参数 Class 的位置
//PendingIntent可以看做是对Intent的包装,通过名称可以看出PendingIntent用于处理即将发生的意图,而Intent用来用来处理马上发生的意图
//本程序用来响应点击通知的打开应用,第二个参数非常重要,点击notification 进入到activity, 使用到pendingIntent类方法,PengdingIntent.getActivity()的第二个参数,即请求参数,实际上是通过该参数来区别不同的Intent的,如果id相同,就会覆盖掉之前的Intent了
PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this,0,push,FLAG_CANCEL_CURRENT);
//第四步:对Builder进行配置:
builder
.setContentTitle("My notification")//标题
.setContentText("Hello World!")// 详细内容
.setContentIntent(contentIntent)//设置点击意图
.setTicker("New message")//第一次推送,角标旁边显示的内容
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setDefaults(Notification.DEFAULT_ALL);//打开呼吸灯,声音,震动,触发系统默认行为
/*Notification.DEFAULT_VIBRATE    //添加默认震动提醒  需要VIBRATE permission
Notification.DEFAULT_SOUND    //添加默认声音提醒
Notification.DEFAULT_LIGHTS//添加默认三色灯提醒
Notification.DEFAULT_ALL//添加默认以上3种全部提醒*/
//.setLights(Color.YELLOW, 300, 0)//单独设置呼吸灯,一般三种颜色:红,绿,蓝,经测试,小米支持黄色
//.setSound(url)//单独设置声音
//.setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })//单独设置震动
//比较手机sdk版本与Android 5.0 Lollipop的sdk
if(android.os.Build.VERSION.SDK_INT>= android.os.Build.VERSION_CODES.LOLLIPOP) {
builder
/*android5.0加入了一种新的模式Notification的显示等级,共有三种:
VISIBILITY_PUBLIC只有在没有锁屏时会显示通知
VISIBILITY_PRIVATE任何情况都会显示通知
VISIBILITY_SECRET在安全锁和没有锁屏的情况下显示通知*/
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
.setCategory(Notification.CATEGORY_MESSAGE)//设置通知类别
//.setColor(context.getResources().getColor(R.color.small_icon_bg_color))//设置smallIcon的背景色
.setFullScreenIntent(contentIntent, true)//将Notification变为悬挂式Notification
.setSmallIcon(R.mipmap.ic_launcher_transparent);//设置小图标
}
else{
builder
.setSmallIcon(R.mipmap.ic_launcher);//设置小图标
}
//第五步:发送通知请求:
Notification notify = builder.build();//得到一个Notification对象
mNotifyMgr.notify(buiderID,notify);//发送通知请求

下面是效果
安卓6.0悬挂式通知效果


安卓6.0悬挂式通知效果

安卓4.4通知下拉效果


安卓4.4通知下拉效果

安卓7.0通知下拉效果


安卓7.0通知下拉效果

2.注意点

1.必须设置这三项否则,通知不显示

    小图标,由setSmallIcon()
    标题,由setContentTitle()
    详细文本,由setContentText()

2.因为google在android5.0上面做了限制,为了统一系统风格。之后的状态栏smallIcon就不能够随便用一张色彩丰富的图片了,只能够有白色和透明两个颜色出现,且smallIcon布局在大图标右下角。因此本例中对安卓5.0以上系统设置的是透明背景,白色logo的图片,5.0以下系统使用的是正常彩色图标。
3.当builder没有设置LargeIcon(大图标)时,拉伸的状态栏窗口中显示大图标的位置会显示小图标的图片,有些手机因为有定制ui,不会显示小图标,比如小米和华为。
4.如果需要加呼吸灯和震动,不要忘记加权限

<!-- 闪光灯权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<!-- 振动器权限 -->
<uses-permission android:name="android.permission.VIBRATE"/>

5.更新notification时,如果通过intent调用同一activity,那么,最好在AndroidManifest中设置activity为singleTop开启模式,否则每次取消掉下拉框中的notification,更新notification时会弹出多个notification,因为创建了多个activity。关于activity开启模式,https://developer.android.com/guide/topics/manifest/activity-element.html

<activity
          android:screenOrientation="portrait"
          android:name=".View.MainActivity"
          android:theme="@style/AppTheme.NoActionBar"
          android:launchMode="singleTop">
</activity>

有关应如何启动 Activity 的指令。共有四种模式与 Intent对象中的 Activity 标志(FLAG_ACTIVITY_*常量)协同工作,以确定在调用 Activity 处理 Intent 时应执行的操作。

三.其他

1.除普通Notification悬挂式Notification外,还有几种其他形式的推送,可看下面链接
http://blog.csdn.net/itachi85/article/details/50096609
http://www.cnblogs.com/plokmju/p/android_Notification.html
2.官方API文档
https://developer.android.com/guide/topics/ui/notifiers/notifications.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容