Android Notifications 百发百中之第二发

Android Notifications 百发百中之第一发

第一发主要介绍了 Notifications 中如果创建一个标准通知,如何设置通知的点击事件,通知的基本操作,如何为通知添加 Action 以及通知的启动和取消。

第二发主要介绍通知栏的各种样式以及如何设置样式来创建你所需要的通知栏,依然是这个表格:
样式 描述
Normal 标准通知,显示标题和单行内容
BigText 多行文字,显示标题和多行内容
BigPicture 显示文字和图片,显示标题、内容和图片
Inbox 邮件,显示标题和多行邮件内容
Messaging 消息,显示和朋友的对话内容
Media 音乐播放器,显示常驻通知栏,可以执行各种操作
Custom 自定义,自定义 layout 的通知栏
01.jpg

在标准通知中,一般情况下通知的标题和内容都只能显示一行,通知内容比较固定,有些时候,一行根本就写不了什么东西,如果想看详情就不得不打开 app,当时就想如果直接在通知上能看到更多的东西该多好啊,然后福利就来了。 Google 你懂的,作为一个世界著名但在中国不存在的公司还是很贴心的,从 Android 4.1 开始,Google 为通知定义好了各种各样的样式,这样你就不需要去自定义,直接使用样式就可以了,这些样式可以满足我们大部分的需求。所以作为一个 Android 开发者那可真是痛并快乐着。怎么痛?呵呵,做过的都知道。

BigText

demo04.gif

如上图所示,你可以点击通知上的向下和向上的箭头来展开和收缩多行文字,比如新闻类的 app,你可以设置多行文字显示给用户更多的内容。


String title = "This is big text title";
String text = "A notification is a message you can display " +
              "to the user outside of your application's normal UI. " +
              "When you tell the system to issue a notification, " +
              "it first appears as an icon in the notification area. ";
NotificationCompat.BigTextStyle style = new NotificationCompat.BigTextStyle();
style.setBigContentTitle(title);
style.bigText(text);
style.setSummaryText(context.getString(R.string.app_name));

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setLargeIcon(largeIcon)
       .setSmallIcon(R.drawable.cry)
       .setTicker(context.getString(R.string.app_name))
       .setWhen(System.currentTimeMillis())
       .setContentTitle(title)
       .setContentText(text)
       .setStyle(style)
       .setCategory(NotificationCompat.CATEGORY_MESSAGE)
       .setAutoCancel(isAutoCancel)
       .setContentIntent(pendingIntent);

如上代码所示,BigText 通知的创建和标准通知的创建的唯一区别就在于设置样式。

style.setSummaryText(),设置应用名称,跟 builder.setTicker() 保持一致即可,当然你也可以设置成其它名称;
style.setBigContentTitle(),设置标题,跟 builder.setContentTitle() 保持一致即可,这样能保证展开和收缩的标题是一样的;
style.bigText(),设置内容,跟 builder.setContentText() 保持一致即可,如果设置的不一样,则在展开和收缩的时候,显示的内容会有变化,会显得比较突兀。

使用 builder.setStyle() 设置样式之后,我们就可以愉快的显示很多内容了。

注意标准通知中的所有属性和操作均可以在 BigText 中使用,比如点击事件和增加 Action 等。

BigPicture

demo07.gif

如上图所示,你可以点击通知上的向下和向上的箭头来展开和收缩图片,比如购物类的 app,在推送商品的同时可以推送此商品的图片,让人有感觉的图片可以分分钟增加用户购物的欲望。

String title = "This is big picture title";
String text = "This is big picture message";
    
NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
style.bigPicture(BitmapFactory.decodeResource(context.getResources(), R.drawable.google));
style.setBigContentTitle(title);
style.setSummaryText(text);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setLargeIcon(largeIcon)
       .setSmallIcon(R.drawable.cry)
       .setTicker(context.getString(R.string.app_name))
       .setWhen(System.currentTimeMillis())
       .setContentTitle(title)
       .setContentText(text)
       .setStyle(style)
       .setCategory(NotificationCompat.CATEGORY_MESSAGE)
       .setAutoCancel(isAutoCancel)
       .setContentIntent(pendingIntent);

如上代码所示,BigPicture 通知的创建和标准通知的创建的唯一区别就在于设置样式。

style.setSummaryText(),设置应用名称,跟 builder.setTicker() 保持一致即可,当然你也可以设置成其它名称;
style.setBigContentTitle(),设置标题,跟 builder.setContentTitle() 保持一致即可,这样能保证展开和收缩的标题是一样的;
style.bigPicture(),设置图片内容, builder 里面是无法直接设置图片的。

使用 builder.setStyle() 设置样式之后,我们就可以愉快的显示图片了。

注意标准通知中的所有属性和操作均可以在 BigPicture 中使用,比如点击事件和增加 Action 等。

Inbox

demo05.gif

顾名思义,收件箱,主要用来推送多个邮件。如上图所示,你可以点击通知上的向下和向上的箭头来展开和收缩多个邮件。

NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle();
style.addLine("This is first inbox message");
style.addLine("This is second inbox message");
style.addLine("This is third inbox message");
style.addLine("This is fourth inbox message");
style.addLine("This is fifth inbox message");
style.addLine("This is sixth inbox message");
style.addLine("This is seventh inbox message");
style.setBigContentTitle("This is inbox title");
style.setSummaryText(context.getString(R.string.app_name));
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setLargeIcon(largeIcon)
       .setSmallIcon(R.drawable.cry)
       .setTicker(context.getString(R.string.app_name))
       .setWhen(System.currentTimeMillis())
       .setContentTitle("This is inbox title")
       .setContentText("This is inbox message")
       .setCategory(NotificationCompat.CATEGORY_EMAIL)
       .setStyle(style)
       .setAutoCancel(isAutoCancel)
       .setContentIntent(pendingIntent);

如上代码所示,Inbox 通知的创建和标准通知的创建的唯一区别就在于设置样式。

style.setSummaryText(),设置应用名称,跟 builder.setTicker() 保持一致即可,当然你也可以设置成其它名称;
style.setBigContentTitle(),设置标题,跟 builder.setContentTitle() 保持一致即可,这样能保证展开和收缩的标题是一样的;
style.addLine(),设置 Inbox 的邮件内容。

使用 builder.setStyle() 设置样式之后,我们就可以愉快的显示多封邮件了。

注意标准通知中的所有属性和操作均可以在 Inbox 中使用,比如点击事件和增加 Action 等。

Messaging

demo08.gif

如上图所示,Messaging 样式主要用来做群组聊天,比如微信群,不用打开 app 就可以看到群里所有人的聊天,还可以直接回复。你可以点击通知上的向下和向上的箭头来展开和收缩群组聊天。

List<Message> list = new ArrayList<>();
list.add(new Message("What do you plan to do on the weekend?"
                    , System.currentTimeMillis(), "Smile"));
list.add(new Message("Sleep.", System.currentTimeMillis(), "Tracy"));
list.add(new Message("Go to Beijing..", System.currentTimeMillis(), "SB"));
list.add(new Message("Play football", System.currentTimeMillis(), "Naocan"));
list.add(new Message("Coding...", System.currentTimeMillis(), "Developer"));

String title = "This is messaging title";
String text = "This is messaging message";
        
NotificationCompat.MessagingStyle style = new NotificationCompat.MessagingStyle("Smile");

for (Message message : list) {
    style.addMessage(message.getText(), message.getTime(), message.getSender());
}
style.setConversationTitle(title);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setLargeIcon(largeIcon)
       .setSmallIcon(R.drawable.cry)
       .setTicker(context.getString(R.string.app_name))
       .setWhen(System.currentTimeMillis())
       .setContentTitle(title)
       .setContentText(text)
       .setCategory(NotificationCompat.CATEGORY_MESSAGE)
       .setStyle(style)
       .setAutoCancel(isAutoCancel)
       .setContentIntent(pendingIntent);

如上代码所示,Messaging 通知的创建和标准通知的创建的唯一区别就在于设置样式。

style.setConversationTitle(),设置会话标题,比如群组名称,跟 builder.setContentTitle() 保持一致即可,当然你也可以设置成其它名称;
style.addMessage(),设置每个人的聊天内容。

使用 builder.setStyle() 设置样式之后,我们就可以愉快的显示多人聊天内容了。

注意标准通知中的所有属性和操作均可以在 Messaging 中使用,比如点击事件和增加 Action 等。

增加群组聊天直接回复 Action:

RemoteInput input = new RemoteInput.Builder(KEY_TEXT_REPLY).setLabel("reply").build();

Intent reply = new Intent();
reply.setAction(REPLY_MESSAGING);
reply.setClass(context, NotificationReceiver.class);
PendingIntent pendingReply = PendingIntent.getBroadcast(context
                            , (int) SystemClock.uptimeMillis()
                            , reply
                            , PendingIntent.FLAG_UPDATE_CURRENT);


NotificationCompat.Action action = new NotificationCompat.Action
                .Builder(0, "reply", pendingReply)
                .addRemoteInput(input)
                .setAllowGeneratedReplies(true)
                .build();

builder.addAction(action);

在广播中接收发送的内容,然后通知通知栏更新群组聊天内容。

Media

demo09.gif

如上图所示,Media 主要用来关联音频播放服务的,通知栏点击后不会自动消失,通知栏的清空也不可用,但你可以左滑或右滑删除,所以一般要设置 setOngoing(true) 防止删除。你还可以在通知栏快捷的暂停、继续、切换歌曲等等,同样的你可以点击通知上的向下和向上的箭头来展开和收缩更多内容。

String title = "This is media title";
String text = "This is media message";
style.setShowCancelButton(true);
style.setCancelButtonIntent(pendingIntent);
style.setShowActionsInCompactView(0, 1);

style.setMediaSession(new MediaSessionCompat(context, "MediaSession",
        new ComponentName(context, Intent.ACTION_MEDIA_BUTTON), null).getSessionToken());

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setLargeIcon(largeIcon)
       .setSmallIcon(R.drawable.cry)
       .setTicker(context.getString(R.string.app_name))
       .setWhen(System.currentTimeMillis())
       .setContentTitle(title)
       .setContentText(text)
       .setCategory(NotificationCompat.CATEGORY_TRANSPORT)
       .setStyle(style)
       .setOngoing(true)
       .setContentIntent(pendingIntent);

Intent back = new Intent();
back.setAction(BACK);
back.setClass(context, NotificationReceiver.class);
PendingIntent pendingBack = PendingIntent.getBroadcast(context
                                , (int) SystemClock.uptimeMillis()
                                , back, PendingIntent.FLAG_UPDATE_CURRENT);

Intent next = new Intent();
next.setAction(NEXT);
next.setClass(context, NotificationReceiver.class);
PendingIntent pendingNext = PendingIntent.getBroadcast(context
                            , (int) SystemClock.uptimeMillis()
                            , next, PendingIntent.FLAG_UPDATE_CURRENT);

Intent pause = new Intent();
pause.setAction(PAUSE);
pause.setClass(context, NotificationReceiver.class);
PendingIntent pendingPause = PendingIntent.getBroadcast(context
                           , (int) SystemClock.uptimeMillis()
                           , pause, PendingIntent.FLAG_UPDATE_CURRENT);

builder.addAction(R.drawable.back, "", pendingBack);
builder.addAction(R.drawable.pause, "", pendingPause);
builder.addAction(R.drawable.next, "", pendingNext);

如上代码所示,Media 通知的创建和标准通知的创建的唯一区别就在于设置样式。

style.setShowCancelButton(true),设置是否显示一个关闭此通知的关闭按钮,在 Adnroid 5.0 之前设置为 true 才会显示,在 5.0 及以上,不管设置为 true 还是 false 均不会显示,也就是说 5.0 及以上没有这个功能,需要通过自定义通知去实现关闭;
style.setCancelButtonIntent(),设置关闭按钮的点击事件;
style.setShowActionsInCompactView(0, 1),设置通知栏收缩时显示的按钮,显示按钮的顺序是通知栏展开时的从左到右,0代表只显示第一个,(0, 1)代表显示第一个和第二个。

使用 builder.setStyle() 设置样式之后,我们就可以愉快的显示音乐播放器了。

注意为了保证音乐能够持续的播放,你需要在 Service 中创建 Media 样式的通知栏,通过 startForeground 启动通知栏,使得通知栏能够在前台显示,避免被销毁。

详细的代码请参见GitHub

推荐阅读:
1、Android 全局管理 Activity 栈
2、Android Notifications 百发百中之第一发
敬请期待 Android Notifications 百发百中之第三发(自定义通知)

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,292评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,983评论 4 60
  • 该是怎样的一个人呢 1)有匹配的眼界和高度,看过大半的世界,不局限自己的一亩三分地,聊什么都能聊得来,不至于完全聊...
    苏小姐请moveon阅读 188评论 0 0