关于通知的属性设置和常见的使用方法可以看我的这篇:Android 通知(使用NotificationCompat.Builder )当时是依照Android 7.0写的博文,发现在Android 8.0上无法弹出,这里做出适配Android O通知的总结。
区别与Android 7.0,需要为通知添加渠道:NotificationChannel。
先上代码举例:
final String CHANNEL_ID = "channel_id_1";
final String CHANNEL_NAME = "channel_name_1";
NotificationManager mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
//只在Android O之上需要渠道
NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID,
CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
//如果这里用IMPORTANCE_NOENE就需要在系统的设置里面开启渠道,
//通知才能正常弹出
mNotificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder builder= new NotificationCompat.Builder(this,CHANNEL_ID);
builder.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("通知标题")
.setContentText("通知内容")
.setAutoCancel(true);
mNotificationManager.notify(notificationId, builder.build());
调用以上代码可以在Android O上显示一则通知。
需要注意的是,渠道是向系统注册的,类似申请权限,注册过的渠道在设置里面都会看见,即使代码改变,再次运行,上次注册的渠道依然会在设置里,除非清除数据或者卸载重装应用。
渠道使用至少有三个步骤:
1.渠道的初始化(构造方法需要三个参数):
NotificationChannel(String id, CharSequence name, int importance)
id:渠道id,每个packege中应该是唯一的,如果太长,该值可能被截断
name:用户可见的渠道名称,可重命名,如果太长,该值可能被截断
importance:用于表示渠道的重要程度。这可以控制发布到此频道的中断通知的方式。有以下6种重要性,是NotificationManager的静态常量,依次递增:
IMPORTANCE_UNSPECIFIED(值为-1)意味着用户没有表达重要性的价值。此值用于保留偏好设置,不应与实际通知关联。
IMPORTANCE_NONE(值为0)不重要的通知:不会在阴影中显示。
IMPORTANCE_MIN(值为1)最低通知重要性:只显示在阴影下,低于折叠。这不应该与Service.startForeground一起使用,因为前台服务应该是用户关心的事情,所以它没有语义意义来将其通知标记为最低重要性。如果您从Android版本O开始执行此操作,系统将显示有关您的应用在后台运行的更高优先级通知。
IMPORTANCE_LOW(值为2)低通知重要性:无处不在,但不侵入视觉。
IMPORTANCE_DEFAULT (值为3):默认通知重要性:随处显示,产生噪音,但不会在视觉上侵入。
IMPORTANCE_HIGH(值为4)更高的通知重要性:随处显示,造成噪音和窥视。可以使用全屏的Intent。
2.将渠道添加到NotificationManager
使用NotificationManager的createNotificationChannel方法
void createNotificationChannel (NotificationChannel channel)
3.builder的构造方法使用有两个参数的那一个
NotificationCompat.Builder(Context context, String channelId)
注意:channelId使用跟第一步一样的id
如上添加三步,适配Android 8.0通知的新特性,让通知成功出现。
*4.渠道的属性设置
// 配置通知渠道的属性
notificationChannel .setDescription("渠道的描述");
// 设置通知出现时的闪灯(如果 android 设备支持的话)
notificationChannel .enableLights(true);
notificationChannel .setLightColor(Color.RED);
// 设置通知出现时的震动(如果 android 设备支持的话)
notificationChannel .enableVibration(true);
notificationChannel .setVibrationPattern(new long[]{1000, 2000, 1000,3000});
//如上设置使手机:静止1秒,震动2秒,静止1秒,震动3秒
用户可以在设置里面阻止或允许应用通知,渠道名称和属性在设置里是可以看的,如下图:
应用通知的详情 | 应用渠道的详情 |
---|---|
用户可以修改渠道的优先级