当应用程序不在前台运行,这时就可以借助通知( 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 哦。