概述
Android 8.0 系统,Google引入通知渠道,提高用户体验,方便用户管理通知信息,同时也提高了通知到达率。
通知适配
- 配置
build.gradle 中targetSdkVersion设置大于等于26。这时如果不对通知渠道适配,通知就无法显示。 - 代码
/**
* 显示通知栏
* @param context 上下文对象
* @param pushMsg 消息bean类
*/
private void showNotification(Context context, PushMsgInfo pushMsg) {
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// 兼容 8.0 系统
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannel(context, nm);
}
NotificationCompat.Builder builder = createNotificationCompatBuilder(context, pushMsg);
nm.notify(0, builder.build());
}
@NonNull
private NotificationCompat.Builder createNotificationCompatBuilder(Context context, PushMsgInfo pushMsg) {
// 通知栏点击接收者
Intent i = new Intent(context, OnPushClickRecevier.class);
i.setAction(OnPushClickRecevier.ACTION);
i.putExtra("data", pushMsg);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, mMessageId, i, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentIntent(pendingIntent);
builder.setSmallIcon(R.drawable.ic_haofang);
builder.setContentTitle(pushMsg.getTitle());
builder.setContentText(pushMsg.getDescription());
builder.setAutoCancel(true);
builder.setDefaults(Notification.DEFAULT_ALL);
String stoneRing = "通知声音地址";
if (!TextUtils.isEmpty(stoneRing)) {
builder.setSound(Uri.parse(stoneRing));
}
return builder;
}
@TargetApi(Build.VERSION_CODES.O)
private void createNotificationChannel(Context context, NotificationManager notificationManager) {
// 通知渠道
NotificationChannel mChannel = new NotificationChannel("渠道Id", "渠道名称", NotificationManager.IMPORTANCE_HIGH);
// 开启指示灯,如果设备有的话。
mChannel.enableLights(true);
// 开启震动
mChannel.enableVibration(true);
// 设置指示灯颜色
mChannel.setLightColor(Color.RED);
// 设置是否应在锁定屏幕上显示此频道的通知
mChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
// 设置是否显示角标
mChannel.setShowBadge(true);
// 设置绕过免打扰模式
mChannel.setBypassDnd(true);
// 设置震动频率
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400});
//最后在notificationmanager中创建该通知渠道
notificationManager.createNotificationChannel(mChannel);
}
注意:
1.创建通知渠道 createNotificationChannel() 一定要写在创建显示通知之前。
2.创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。
- NotificationChannel 构造函数
/**
* NotificationChannel 构造函数
* @param id 渠道id
* @param name 渠道名称
* @param importance 渠道重要等级 IMPORTANCE_HIGH IMPORTANCE_DEFAULT IMPORTANCE_LOW IMPORTANCE_MIN
*/
public NotificationChannel(java.lang.String id, java.lang.CharSequence name, int importance) {
// TODO compiled code
}