Android自定义Notification兼容笔记

通知栏简介

状态通知栏主要涉及到2个类: Notification 和 NotificationManager
Notification为通知信息类,它里面对应了通知栏的各个属性
NotificationManager : 是状态栏通知的管理类,负责发通知、清除通知等操作。

注册系统Service

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

1. flags

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

notification.flags = Notification.FLAG_AUTO_CANCEL;
提醒标志符成员:

// 三色灯提醒,在使用三色灯提醒时候必须加该标志符
Notification.FLAG_SHOW_LIGHTS
// 发起正在运行事件(活动中),无法手动移除
Notification.FLAG_ONGOING_EVENT
// 让声音、振动无限循环,直到用户响应(取消或者打开)
Notification.FLAG_INSISTENT
// 发起Notification后,铃声和震动均只执行一次
Notification.FLAG_ONLY_ALERT_ONCE
// 用户单击通知后自动消失
Notification.FLAG_AUTO_CANCEL
// 可让通知栏点清除键不消失
Notification.FLAG_NO_CLEAR
// 表示正在运行的服务
Notification.FLAG_FOREGROUND_SERVICE

2. PendingIntent

使用通知栏我们可能要监听用户点击通知栏和移除通知栏的事件,比如暂停/继续下载和用户手动移除通知栏暂停下载。

Notification mNotification = new Notification(icon, tickerText, when);
// 移除通知栏事件设置
mNotification.deleteIntent = getDeleteIntent();
// 点击通知栏事件设置
mNotification.contentIntent = getDefalutIntent();

分别对deleteIntent和contentIntent赋值,根据action或者requestCode在接收到关播的时候进行区分,例如:

private PendingIntent getDeleteIntent() {
    Intent deleteIntent = new Intent(ACTION_DELETE);
    return PendingIntent.getBroadcast(mContext, DEL_REQUESTCODE, deleteIntent, PendingIntent.FLAG_CANCEL_CURRENT);
}

getBroadcast方法的官方解释:

Retrieve a PendingIntent that will perform a broadcast..

  • 在指定intent.setClass(context, XXXReceiver.class);的广播类的时候会出现接受不到关播的情况,所以我把这段操作给取消了,发起通知栏的activity注册广播后即可接收。
PendingIntent的位标识符:

FLAG_ONE_SHOT 表示返回的PendingIntent仅能执行一次,执行完后自动取消
FLAG_NO_CREATE 表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL
FLAG_CANCEL_CURRENT 表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent,这个有利于数据保持为最新的,可以用于即时通信的通信场景
FLAG_UPDATE_CURRENT 表示更新的PendingIntent,所有对应的Intent里面的extra被更新为最新的

  • 通过extra数据来区分intent,应采用PendingIntent.FLAG_UPDATE_CURRENT),且每次num不一样
PendingIntent点击事件设置

contentIntent:在通知窗口区域,Notification被单击时的响应事件由该intent触发;
deleteIntent:当用户点击全部清除按钮时,响应该清除事件的Intent;
fullScreenIntent:响应紧急状态的全屏事件(例如来电事件)

有时我们使用contentIntent实现点击操作时发现它会自动收起手机下拉菜单,但我们并不想这样的时候,需要自定义监听事件,但是要注意,2.3及2.3以下版本中,自定义的通知栏中如果带有按钮,可能按钮点击事件会失灵。

// 判断版本之后才进行监听
if (getSystemVersion() > 10) {
    Intent buttonIntent = new Intent(ACTION_BUTTON);
    buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PALY_ID);
    PendingIntent intent_paly = PendingIntent.getBroadcast(mContext, 2,buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    // 更改此处的id进行某个控件的监听
    contentview.setOnClickPendingIntent(R.id.llPro, intent_paly);
}

3. RemoteViews

当我们要在通知栏实现显示下载进度条进度时,会用到setProgress,此方法在4.0及以后版本才有用,如果为早期版本:需要自定义通知布局RemoteViews,其中包含ProgressBar视图。

但是使用RemoteViews是有限制的:

error:android.app.RemoteServiceException: Bad notification posted from package com.example.notifications: Couldn't expand RemoteViews for: StatusBarNotification(package=com.example.notifications id=101 tag=null notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x2))

Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。否则会引起ClassNotFoundException异常

  • 遵循了以上的条件有时仍然会报错,API 11+才能使用的style要谨慎使用,否则会报RemoteServiceException,且很难排查出来。

4. 低版本中,自定义布局中的字体颜色的设置

  • 由于2.3及之前版本,背景色是白色的,而2.3以上的版本背景色是暗色的,所以在2.3之后的版本中(即API >=9的版本中),在资源文件下的src/values-v9目录中的style.xml文件中设置它标题和内容的颜色应该为白色或其他暖色调,否则将无法看清通知栏上的内容。

5. 自定义布局的设置方法

2.3之后:
通过Builder以下方法赋于自定义布局。
mBuilder.setContent(view_custom)
2.3及2.3之前:
通过 Notification notify = mBuilder.build();
notify.contentView = view_custom;
mNotificationManager.notify(notifyId, notify)

所以有兼容2.3版本需求的项目可以直接选择用后者。

我的博客(第一时间更新):
http://huangss.farbox.com/

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

推荐阅读更多精彩内容