Android 学习笔记 —— Notification 的使用
Notification
随着 Android 版本变更,Notification 的兼容性并不是很好。为了解决版本兼容性问题,应该使用 NotificationCompat.Builder 类来构建 Notification 对象。同时,使用 NotificationManager 对通知进行管理,另外从 Android 8.0 开始引入了 NotificationChannel 通知渠道用来对通知进行分类,因此还需要创建并指定通知渠道。
NotificationChannel
// 获取 NotificationManager 对象
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Android 8.0 及更高版本需要创建 NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 第一个参数为 channelId 渠道ID,保证全局唯一
// 第二个参数为 channelName 渠道名称,可在应用通知管理中的看到
// 第三个参数为渠道的重要级别,IMPORTANCE_HIGH 需要用户立即看见,并弹出横幅显示内容
NotificationChannel channel = new NotificationChannel("test", "Test", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel); // 创建渠道
}
NotificationChannel 的方法对该渠道的所有通知生效:
getId()
:获取 ChannleIdenableLights()
:开启指示灯,如果设备有的话setLightColor()
:设置指示灯颜色enableVibration()
:开启震动setVibrationPattern()
:设置震动频率setImportance()
:设置频道重要性getImportance()
:获取频道重要性setSound()
:设置声音getSound()
:获取声音setGroup()
:设置 ChannleGroupgetGroup()
:得到 ChannleGroupsetBypassDnd()
:设置绕过免打扰模式canBypassDnd()
:检测是否绕过免打扰模式getName()
:获取名称setLockScreenVisibility()
:设置是否应在锁定屏幕上显示通知getLockscreenVisibility()
:检测是否应在锁定屏幕上显示通知setShowBadge()
:设置是否显示角标canShowBadge()
:检测是否显示角标
创建并发送 Notification
// 构建时指定 channelId 渠道ID
Notification notification = new NotificationCompat.Builder(this, "test")
.setContentTitle("This is content title.") // 设置标题
.setContentText("This is content text.") // 设置内容
.setWhen(System.currentTimeMillis()) // 设置通知时间
.setShowWhen(true) // 设置是否显示时间
.setAutoCancel(true) // 设置点击后自动取消
.setSmallIcon(R.mipmap.ic_launcher) // 小图标在状态栏中显示,从 Android 5.0 开始,状态栏图标只使用 alpha 图层来进行绘制,即图标不带颜色。
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) //大图标在下拉状态栏中的通知中显示
// 注意,这里构建 Bitmap 对象的方式是有问题的,因为 R.mipmap.ic_launcher 是 xml 文件,请使用正常的图片格式,这里仅做示例
.build();
manager.notify(1, notification); // 发送通知
Notification 的点击事件
Notification 的点击事件是通过 PendingIntent 去执行实现的,它与 Intent 类似都可以指定一个“意图(行为动作)”,但它并不是 Intent。另外,它需要一个 Intent 对象来获取实例。
Intent intent = new Intent(this, MainActivity.class);
// PendingIntent 对象可以根据需求使用 getActivity() 方法、getBroadcast() 方法或 getService() 方法获取,传入参数都是相同的,以 getActivity() 为例
// 第一个参数为 Context 上下文
// 第二个参数是请求码,通常用不到这里传入 0
// 第三个参数是 Intent 对象
// 第四个参数用于控制 PendingIntent 的可变性,通常用不到这里传入 FLAG_IMMUTABLE,参数具体含义查看官方文档
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
给 Notification 指定点击事件只需要在构建对象时调用 setContentIntent()
方法,并传入 PendingIntent 对象即可。
Notification notification = new NotificationCompat.Builder(this, "test")
// ...
.setContentIntent(pi) // 设置点击事件
.build();
使用 setStyle() 方法显示长文字和图片
setContentText(()
方法可以设置通知内容的文字,但文字长度多长是无法显示完整的,多出的部分用省略号代替。嗯,很合理。如果想要显示完整的长文字则应该使用 setStyle()
方法,同时 setContentText()
方法会失效。
Notification notification = new NotificationCompat.Builder(this, "test")
// ...
.setStyle(new NotificationCompat.BigTextStyle().bigText("Amie..."))
.build();
显示图片也是使用 setStyle()
方法,不过参数样式需要改成 BigPictureStyle,而且 setContentText()
方法依旧生效,文字内容正常显示。
Notification notification = new NotificationCompat.Builder(this, "test")
// ...
// 构建 Bitmap 对象请使用正常的图片格式,这里仅做示例
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture((BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))))
.build();