Android学习系列之-通知Notification

今天打算介绍下通知的基本使用方法。首先,看下官网的介绍。

通知是可以在应用的常规 UI 外部向用户显示的消息。当您告知系统发出通知时,它将先以图标的形式显示在通知区域中。用户可以打开抽屉式通知栏查看通知的详细信息。 通知区域和抽屉式通知栏均是由系统控制的区域,用户可以随时查看。

具体的展示如下:


图1 通知区域中的通知。

图2 抽屉式通知栏中的通知

相信看完介绍,大家应该也都明白通知的一些使用场景了。现在大部分的应用都有推送功能,而推送都是用通知来展示的。比如简书每天就不定时的给你发推送。下面就介绍一下通知的具体使用方法。

基本知识

要创建通知,我们就需要Notification这个类,我们可以通过 NotificationCompat.Builder 对象中为通知指定 UI 信息和操作,然后通过调用 NotificationCompat.Builder.build(),它将返回包含您的具体规范的 Notification 对象。然后通过 NotificationManager.notify()
将 Notification 对象传递给系统,由系统来帮你完成后续的处理。
Notification对象必须包含以下三个元素:

  • 小图标,由 setSmallIcon() 方法设置
  • 标题,由 setContentTitle 方法设置
  • 详细文本,由 setContentText()设置

也就是说这三个元素是必须的,不然就算创建了Notification对象也是发不出去的。另外就是需要解释一下这个小图标,小图标是指图一通知区域的小图标,也是图二中通知大图右下角的小图片,他是一个特殊的图。5.0后Android官方要求,所有应用程序的通知栏图标,应该只使用alpha图层来进行绘制,而不应该包括RGB图层。即不要为通知的图标添加任何额外的透明度,渐变色,不要用颜色将通知图标与其他应用,比如系统应用,应用的通知图标(即小图标)只能是在透明的背景上有白色的图案。
另外具体的设计可以参考materia design 关于Notification的设计规范,地址https://material.io/guidelines/patterns/notifications.html
下面贴两张图来让大家更明了各个参数对应的UI显示,

small_icon.png

通知各元素对应的显示

上图的NotificationIcon 其实是smallIcon,Title即ContentTitle,Message即ContentText,另外还有时间戳等。所有的通知的其他设置都是可选的。

通知操作

我们设置好了通知之后,需要再向通知添加一个操作,以用来相应用户的点击操作。当然你也可以不加这个操作,就让它挂在通知栏,用户点了就是没反应,但是这样用户体验多不好。用户点击通知后可以让用户从通知直接跳转到相应的activity,以执行下一步操作。在 Notification内部,操作本身由 PendingIntent 定义,后者包含在应用中启动 Activity的 Intent。

创建通知

我们可以通过以下步骤去创建一个通知

  1. 先创建NotificationCompat.Builder,并且可以通过这个builder去设置通知需要的内容,来生成Notification。
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
Notification notification = builder
.setContentTitle("这是通知标题")
.setContentText("这是通知内容")
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(
  getResources(), R.mipmap.ic_launcher))
.build();
  1. 设置优先级
    通知还有优先级,我们可以通过setPriority() 传入通知的优先级,目前通知的优先级有五个等级,范围从 PRIORITY_MIN (-2) 到 PRIORITY_MAX (2);如果未设置,则优先级默认为 PRIORITY_DEFAULT (0)。优先级越高,在通知栏就排的越往上。

  2. 设置一个点击后的动作
    如之前所说的,我们可以通过pendingIntent来设置一个通知点击后的操作。比如跳转到一个activity。

Intent resultIntent = new Intent(this, ResultActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(
            this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);

通过这种方式就可以让用户点击通知后跳转到ResultActivity页面了。

  1. 用NotificationManager 发送通知
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(mId, mBuilder.build());
  1. 更新通知
    当我们需要更新通知中的内容的时候就可以依据上面设置的通知的id去更新的通知,只需要通知Id相同就可以更新,具体操作其实和创建差不多,官方的示例代码如下:
mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
    .setContentTitle("New Message")
    .setContentText("You've received new messages.")
    .setSmallIcon(R.drawable.ic_notify_status)
numMessages = 0;
// Start of a loop that processes data and then notifies the user
...
    mNotifyBuilder.setContentText(currentText)
        .setNumber(++numMessages);
    // Because the ID remains unchanged, the existing notification is
    // updated.
    mNotificationManager.notify(
            notifyID,
            mNotifyBuilder.build());
  1. 删除或取消通知
    当我们需要手动取消通知的时候,可以调用NotificationManager的 cancel(),具体的删除有以下几种方式:
  • 用户单独或通过使用“全部清除”清除了该通知(如果通知可以清除)。
  • 用户点击通知,且您在创建通知时调用了 setAutoCancel()
  • 针对特定的通知 ID 调用了 cancel() 此方法还会删除当前通知。
  • 调用了cancelAll()方法,该方法将删除之前发出的所有通知。

好了,到这里已经可以创建基本的Notification了,之后再写一些通知的其他使用方式。

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

推荐阅读更多精彩内容