说说 Android 中的通知(Notification)

当应用程序不在前台运行,这时就可以借助通知( Notification )向用户发送一些提示消息。 发出通知后,手机最上方的状态栏中就会显示一个通知图标,下拉状态栏就会看到通知的详情。

1 基本用法

//获取系统通知服务
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

String contentTitle = "重庆现最苗条电梯"; //标题
String contentText = "宽度仅容纳一人爆红网络";//内容
Notification notification = new NotificationCompat.Builder(context).setContentTitle(contentTitle)
        .setContentText(contentText).setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).build();
manager.notify(1, notification);

*使用 NotificationCompat 可以保证通知功能能够在目前所有的 Android 版本中都适用。
*NotificationCompat 的 Builder 支持使用连缀的设置方法,这一点很像 jQuery。

Builder 设置方法:

方法名 说明
setContentTitle(CharSequence title) 设置标题。
setContentText(CharSequence text) 设置内容。
setWhen(long when) 设置创建通知的时间,单位是毫秒。
setSmallIcon(int icon) 设置通知的小图标,会显示在手机的左上角。
setLargeIcon(Bitmap icon) 设置通知的大图标,下拉系统的状态栏时,就可以看到它啦。

notify(int id, Notification notification) 方法用于显示通知,它有两个参数:id 是我们应用中为通知定义的唯一标识符;notification 即是我们建立的通知对象。

运行后:

通知小图标

下拉系统状态栏,即可看到我们新建的通知消息:

这时的通知消息还未实现点击效果,我们可以通过 PendingIntent 来实现。它与 Intent 的不同之处是:

  • Intent - 立即执行某个动作。
  • PendingIntent - 在某个合适的时机去执行某个动作。

我们新建一个活动,当用户点击通知消息后,会跳转到这个活动中。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_notification"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="26sp"
        android:text="在重庆解放碑得意世界附近,有一部迷你电梯,因其异常狭窄引起了广泛的关注,对于这部魔性的电梯,有网友表示“这是对胖子的深深恶意······”"
        />

</RelativeLayout>

这个活动很简单,只是展示一些文本内容。

接着,修改之前的活动代码:

//获取系统通知服务
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

//创建 PendingIntent
int requestCode = 0;
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
Intent intent = new Intent(context, NotificationActivity.class);//启动 NotificationActivity 活动
PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, flags);

//创建通知
String contentTitle = "重庆现最苗条电梯"; //标题
String contentText = "宽度仅容纳一人爆红网络";//内容
Notification notification = new NotificationCompat.Builder(context).setContentTitle(contentTitle)
        .setContentText(contentText).setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).setContentIntent(pendingIntent).setAutoCancel(true).build();
manager.notify(1, notification);

这里创建 PendingIntent 对象,并把它放入 NotificationCompat.Builder 中。

PendingIntent.getActivity 定义如下:

 public static PendingIntent getActivity(Context context, int requestCode,
            Intent intent, @Flags int flags)
参数 描述
Context 上下文,在 Activity 类中就是本身(this)。
requestCode 请求码。
intent Intent 对象。
flags 行为方式。

flags 行为方式类型:

类型 描述
FLAG_ONE_SHOT PendingIntent 对象只能被使用一次。
FLAG_NO_CREATE 如果 PendingIntent 对象不存在,则返回 null。
FLAG_CANCEL_CURRENT 即使之前的 PendingIntent 对象已经存在,也会创建一个新的 PendingIntent 对象。
FLAG_UPDATE_CURRENT 如果之前的 PendingIntent 对象已经存在,那么会更新它的内容。(常用)

注意:我们构建 Build 的过程中加入了 setAutoCancel(true),则表示当用户点击了通知后,手机左上角的图标就不会再显示啦。也可以使用 NotificationManager 的 cancel 方法主动取消,这可以应用于某些特殊场景:

int notifyId = 1;//通知 ID
manager.notify(notifyId, notification);

//延迟 5 s,要不通知一下子就会被取消啦
try {
    Thread.sleep(5000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
manager.cancel(notifyId);

运行程序,再次点击系统通知栏中的通知,这时将会弹出通知活动页:

2 高级功能

2.1 自定义通知音

打开 Android Device Monitor,可以看到在 "/system/media/audio/notifications/ 下自带了很多通知音,我们可以选择甚至是自定义一个喜欢的通知音:

系统自带的通知音
//自定义通知音
Uri customSound = Uri.fromFile(new File("/system/media/audio/notifications/Altair.ogg"));

可以通过以下方式获得系统的通知音:

Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

最后使用 setSound 方法来设置通知音:

 public Builder setSound(Uri sound)

是不是很简单呀O(∩_∩)O哈哈~

2.2 通知振动

通过设置 vibrate 属性,可以让通知出现时让手机振动,它定义如下:

public Builder setVibrate(long[] pattern) 

pattern 是长整型数组,它被用来设置手机静止和振动的时长,以毫秒为单位。它是一种交替的设置模式,比如下标 0 表示静止的时长,下标 1 表示振动的时长,下标 2 又表示振动的时长,以此类推。

Notification notification = new NotificationCompat.Builder(context)
...
.setVibrate(new long[]{0,1000,1000,1000}).build();

接着,在 AndroidManifest.xml 中声明振动权限:

<uses-permission android:name="android.permission.VIBRATE"/>

这样,当用户收到通知时,手机就会振动啦 O(∩_∩)O哈哈~

2.3 呼吸灯

呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸,它起到一个通知提醒的作用。

通过设置 setLights ,可以控制呼吸灯的变化频率,它定义如下:

public Builder setLights(@ColorInt int argb, int onMs, int offMs) 
参数 说明
argb 灯的颜色,通过 Color 类来设置。
onMs 灯亮的时长,单位:毫秒。
offMs 灯灭的时长,单位:毫秒。
//自定义颜色-紫色
int color=Color.rgb(255,0,255);

Notification notification = new NotificationCompat.Builder(context).setContentTitle(contentTitle)
...
.setLights(color,1000,1000).build();

2.4 富文本

NotificationCompat.Builder 类中的 setStyle() 方法,可以让我们构建出富文本的通知内容, 这个方法接收一个 NotificationCompat.style 参数,通过它用来创建出具体的富文本信息,如长文字 、 图片等 。

2.4.1 长文本

如果 setContentText() 传入的内容过长,那么一行内显示不完的内容就会变为省略号:

//长文字
String longContentText = " 近日,重庆现最苗条电梯走红网络,到底是怎么样情况呢?在重庆解放碑得意世界附近,有一部显得十分“苗条”的迷你电梯,经测量,宽度约57.5厘米,只能容下一个人乘坐,一般而言,普通的电梯可以站两个人,但这部迷你电梯相对狭窄,因而有不少游客专程来打卡拍照。";//内容
android.support.v4.app.NotificationCompat.BigTextStyle bigTextStyle=new NotificationCompat.BigTextStyle().bigText(longContentText);


Notification notification = new NotificationCompat.Builder(context).setContentTitle(contentTitle)
        ...
        .setStyle(bigTextStyle).build();
长文本显示效果

2.4.2 图片

图片显示效果

2.5 优先级

NotificationCompat.Builder 类中的 setPriority() 方法可用于设置通知的重要程度,它接收一个整型参数,在 NotificationCompat 中定义了 5 级优先级常量值:

可用的优先级参数
 int priority=NotificationCompat.PRIORITY_MAX;

Notification notification = new NotificationCompat.Builder(context).setContentTitle(contentTitle)
...
                        .setPriority(priority)
                        .build();

如果设置为最高优先级,那么它会直接显示在屏幕顶部:

最高优先级效果

确保这个通知对于用户来说确实是至关重要的,否则如果用户产生了反感,那么有可能会卸载掉这个 APP 哦。

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

推荐阅读更多精彩内容