3.Notification通知栏上手

apk/源码下载地址

封面.png

目录

1.应用场景
2.通知栏版本兼容性
3.small icon规范
4.发送一个简单的通知
5.有提醒的通知(声音/振动/闪光灯)
6.有响应事件的通知
7.有按钮的通知
8.有进度条的通知
9.清除通知
10.锁屏显示控制
11.浮动通知
12.长文本通知 (要系统和厂商OS支持)
13.自定义通知栏

demo页面.png
通知栏列表.png

1.应用场景

  • 显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)
  • 显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)
  • 显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)
  • 通知栏形式的交互 (例如:切换歌曲、下载安装提示等)

2.通知栏版本兼容性

  • 各个版本和不同厂商的修改导致通知栏的效果会有一些不一样
  • 推荐用最新版的sdk来开发
  • 用兼容包下的NotificationCompat类来实现通知栏功能
//不用
android.app.Notification
android.app.NotificationManager
//用
android.support.v4.app.NotificationCompat.Builder
android.support.v4.app.NotificationManagerCompat

3.small icon规范

  • 在target 20以上的机器上
  • small icon的图标需要是 透明背景
  • 这个有很多相关介绍的文章,总结起来就是上面2点

4.发送一个简单的通知

public void sendSimpleNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    //设置内容
    builder.setContentTitle("简单的通知的标题")
            //设置内容
            .setContentText("这是通知内容")
            //大图标
            .setLargeIcon(BitmapFactory.decodeResource(
                    context.getResources(), R.mipmap.ic_launcher))
            //设置小图标背景色(默认不设置)
            .setColor(0xffff0000)
            //设置这个标志当用户单击面板就可以让通知将自动取消
            .setAutoCancel(true)
            //小图标
            .setSmallIcon(R.mipmap.ic_launcher);
    //通知管理器
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    //通知标签
    String tag = TAG_TEST;
    //通知Id  一个id对应一个单独的通知栏
    int id = ID_SIMPLE;
    //发送通知
    managerCompat.notify(tag, id, builder.build());
}

5.有提醒的通知(声音/振动/闪光灯)

public void sendRemindNotification(Context context){
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
            .setContentTitle("下雨了")
            .setContentText("家里的衣服收了吗?")
            .setSmallIcon(R.mipmap.ic_launcher)
            //声音
            .setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.remind))
            //振动 振500 停500 再振500
            .setVibrate(new long[]{0, 500, 500, 500})
            //灯光 亮200 灭100
            .setLights(Color.BLUE, 200, 100);
            //也可以全部设置 (灯光 声音 振动)
            //.setDefaults(NotificationCompat.DEFAULT_ALL)
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_REMIND, builder.build());
}

6.有响应事件的通知

public void sendOnClickNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
            .setContentTitle("新的邮件")
            .setContentText("尊敬的用户:为回馈老用户....")
            .setSmallIcon(R.mipmap.ic_launcher)
            //点击跳转的意图
            .setContentIntent(responseActivityIntent(context, "查看邮寄"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_ONCLICK, builder.build());
}
/**
 * 响应开启一个服务的意图
 */
private PendingIntent responseServiceIntent(Context context, int action, String desc) {
    Intent intent = new Intent(context, ResponseService.class);
    intent.putExtra(ResponseService.EXTRA_ACTION, action);
    intent.putExtra(ResponseService.EXTRA_DESC, desc);
    //设置一个action防止PendingIntent被复用 导致数据错乱
    intent.setAction("Service_Intent_Action_" + action);
    return PendingIntent.getService(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

7.有按钮的通知

public void sendOnButtonNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
            .setContentTitle("新的好友")
            .setContentText("隔壁老王添加你为好友?")
            .setSmallIcon(R.mipmap.ic_launcher)
            //添加操作 点击跳转的意图
            .addAction(R.mipmap.ic_launcher, "接受", responseServiceIntent(context, ResponseService.ACTION_ACCEPT, "点击了接收"))
            .addAction(R.mipmap.ic_launcher, "拒绝", responseServiceIntent(context, ResponseService.ACTION_CANCEL, "点击了拒绝"))
            //点击跳转的意图
            .setContentIntent(responseActivityIntent(context, "处理老王的好友请求"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_ONBUTTON, builder.build());
}
/**
 * 响应开启一个活动的意图
 */
private PendingIntent responseActivityIntent(Context context, String desc) {
    Intent intent = new Intent(context, ResponseActivity.class);
    //设置一个action防止PendingIntent被复用 导致数据错乱
    intent.setAction("Activity_Intent_Action_" + desc);
    intent.putExtra(ResponseActivity.EXTRA_DESC, desc);
    //启动activity的不是activity 就需要加这个
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

8.有进度条的通知

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder
        .setContentTitle("文件名")
        .setContentText("下载进度描述/进度等")
        .setSmallIcon(R.mipmap.ic_launcher)
        //indeterminate 模糊的进度显示
        .setProgress(100,50,true)
        //点击跳转的意图
        .setContentIntent(responseActivityIntent(context, "处理下载任务"));
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(TAG_TEST, ID_ONBUTTON, builder.build());

9.清除通知

//1.设置自动管理通知
NotificationCompat.Builder.setAutoCancel(true);
//2.动态清除
NotificationManagerCompat notifyMg = NotificationManagerCompat.from(context);
//取消 TAG ID 相应的通知
notifyMg.cancel(TAG_TEST,id);
//3.右滑划掉 点击清除
//4.保持通知不被移除
NotificationCompat.Builder.setOngoing(true);

10.锁屏显示控制

//1设置在锁屏页面显示
NotificationCompat.Builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
//2设置锁屏上显示的时候 可以自定义在锁屏上的通知栏
NotificationCompat.Builder.setPublicVersion(null)

11.浮动通知

//设置HIGH MAX (要系统和厂商OS支持)
NotificationCompat.Builder.setPriority(NotificationCompat.PRIORITY_MAX)

12.长文本通知 (要系统和厂商OS支持)

public void sendBigTextNotification(Context context) {
    NotificationCompat.BigTextStyle style = new android.support.v7.app.NotificationCompat.BigTextStyle();
    style.bigText("她的月收在接近四万的样子。她偶尔会接广告啊私活什么的,就像作者私下和媒体约稿一样,为了保证质量也不会多接,加上她本身所在的公司待遇优厚,所以这个不算高但绝对不低的数字确实是她一笔一笔画出来的,我和她认识也是因为我当时有个设计业务找到她。");
    style.setSummaryText("来自火星");
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
            .setContentTitle("不得不看的一篇文章")
            .setAutoCancel(true)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setStyle(style)
            //点击跳转的意图
            .setContentIntent(responseActivityIntent(context, "处理来自火星的推问"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_BIG_TEXT, builder.build());
}

13.自定义通知栏

public void sendCustomNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_custom_notification);
    remoteViews.setTextViewText(R.id.tv_content, "自定义内容");
    remoteViews.setImageViewResource(R.id.iv_close, R.mipmap.ic_launcher);
    remoteViews.setOnClickPendingIntent(R.id.iv_close, responseActivityIntent(context, "close"));
    builder.setContent(remoteViews)
            .setSmallIcon(R.mipmap.ic_launcher);
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_CUSTOM, builder.build());
}

更多参考资料:
Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
Android自定义Notification并没有那么简单

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,051评论 25 707
  • 原文出处: http://www.androidchina.net/6174.html Notification在...
    木木00阅读 12,270评论 3 32
  • 开始云KASS企业内容管理系统产品发布及功能更新 本次产品改版升级,全面优化了PC客户端、本地盘符与移动端APP等...
    开始云阅读 588评论 0 0
  • 我的世界不见皓月,不见星悬,只有黑暗。无路可逃的黑暗,侵蚀我血流成河的伤口,身体开始虚浮。哭和笑对我来说也许是一...
    孤掷阅读 278评论 0 1