目录
1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)
1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)
前言
最近做了一个聊天功能,涉及到了收到消息要通知给用户的部分,需要写一个通知。发现通知我是太久没用了,我知道的实现方法已经不适用了。所以这几天通过Google文档整理了之后可能会常用到的2种情况下使用的通知使用方法:基本通知,消息通知(使用分组)。
也涉及到以下问题:android低版本到高版本手机的通知兼容问题,帮助用户打开通知开关,android5.x手机状态栏icon是白块问题。
条件:Android studio,minSdkVersion = 16,targetSdkVersion = 29
通知图片:需要多制作一个背景透明,内容白色填充的icon,做适配
一、基本通知实现步骤
1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)
先创建一个NotificationChannel对象,然后放入notificationManager.createNotificationChannel的参数,注册应用的通知渠道。
设置重要性: int importance = NotificationManager.IMPORTANCE_DEFAULT; 用默认的就可以
//步骤1:创建渠道 并 设置重要性(8.0及以上需要设置)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = channel_name;//渠道名字
String description = channel_description;//渠道描述(可以不设置)
int importance = NotificationManager.IMPORTANCE_DEFAULT;//设置渠道重要性, 用默认的就刚好
//1 创建NotificationChannel对象,并设置重要性
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
//2 createNotificationChannel创建通知渠道
NotificationManager notificationManager = mActivity.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
2.设置点击通知跳转activity
需要创建一个PendingIntent对象,并设置跳转参数
//步骤2:设置通知的点按操作(跳转的Intent)
Intent intent = new Intent(mActivity, TwoActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mActivity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);//FLAG_UPDATE_CURRENT:表示已存在则直接使用
3.创建通知,设置图标
使用 NotificationCompat.Builder
对象设置通知内容和渠道。 setPriority()
设置优先级,这个也用默认的就可以。
//步骤3:创建通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(mActivity, CHANNEL_ID)
.setContentTitle(ettitle)
.setContentText(etmsg)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)//设置重要性,这里的重要性设置是Android8.0以下使用的(用默认的就刚好)
.setContentIntent(pendingIntent)//跳转activity
.setAutoCancel(true);//点按通知后自动移除通知。
//设置图标(这里需要做不同Android版本设置)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {// < Android 5.0(21)
//只设置小图标,为app原icon图片。 状态栏和抽屉列表里都显示小图标
builder.setSmallIcon(com.module.libcommon.R.drawable.ic_launcher_yuan);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && // >= Android 5.0(21)并且 < Android 7.0(24)
Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
//设置小图标 和 大图标
//小图标:在状态栏展示,使用图片为背景透明,内容为白色的icon图片。(原因:这部分手机,状态栏图标会显示为白块,只能展示白色icon图片)
//大图标:在抽屉列表展示,设置为app的原icon图片(如果不设置会默认用小图标,并且图片不能适配,不好看)
builder.setSmallIcon(com.module.libcommon.R.drawable.icon_w);
builder.setLargeIcon(ImageUtils.getBitmap("drawable://" + com.module.libcommon.R.drawable.ic_launcher_yuan));
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && // >= Android 7.0(24)并且 < Android 8.0(26)
Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
//只设置小图标,小图标:用白色内容,透明背景icon图片。 状态栏和抽屉列表里都显示小图标
builder.setSmallIcon(com.module.libcommon.R.drawable.icon_w);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ // >= Android 8.0(26)
//只设置小图标,为app原icon图片。 在状态栏和抽屉列表里都显示app的icon。
// * 这里有个问题是,不管我设置了什么图片做图标,都会展示app的icon作为图标。但是不设置图标使用会报错崩溃的,还要设置。
// * 因为测试机型有限,所以设置为app原icon图片。
builder.setSmallIcon(com.module.libcommon.R.drawable.ic_launcher_yuan);//小图标
}
4.显示通知
调用 NotificationManagerCompat.notify()
,并将通知的唯一 ID 和 NotificationCompat.Builder.build()
的结果传递给它
//步骤4:显示通知
notificationId = Util.getRandomNumberInt(100,1);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mActivity);
notificationManager.notify(notificationId, builder.build());//notificationId:通知 ID
二、消息通知实现步骤(使用分组)
1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)
和 “基本通知实现步骤 1” 一样写,然后把importance重要性设置为高等级,这个有响铃。
int importance = NotificationManager.IMPORTANCE_HIGH;//设置渠道重要性, 消息用高等级的,有响铃
2.设置点击通知跳转activity
和 “基本通知实现步骤 2” 一样写
3.创建通知组并为其添加通知
和 “基本通知实现步骤 3” 一样写,然后修改下面几点:
3.1、修改优先级为高等级:.setPriority(NotificationCompat.PRIORITY_HIGH)//设置优先级(重要性),这里的重要性设置是Android8.0以下使用的(高等级有响铃)
3.2、为该通知组定义一个唯一标识符String字符串,通知组名称:private String GROUP_KEY_WORK_EMAIL = "WORK_EMAIL";
3.3、调用 setGroup() 并传入通知组名称:.setGroup(GROUP_KEY_WORK_EMAIL);
*** Google文档说明:如需创建通知组,请为该通知组定义一个唯一标识符字符串。然后,对于您想要添加到通知组中的每条通知,只需调用 setGroup()
并传入通知组名称即可。***
NotificationCompat.Builder builder = new NotificationCompat.Builder(mActivity, CHANNEL_ID)
.setContentTitle(ettitle)
.setContentText(etmsg)
.setPriority(NotificationCompat.PRIORITY_HIGH)//设置重要性,这里的重要性设置是Android8.0以下使用的(消息用高等级的,有响铃)
.setContentIntent(pendingIntent)//跳转activity
.setAutoCancel(true)//点按通知后自动移除通知。
.setGroup(GROUP_KEY_WORK_EMAIL);//调用 setGroup()并传入通知组名称
4.设置通知组摘要
*** 这个是个Google说明:
在 Android 7.0(API 级别 24)及更高版本上,系统会使用每条通知中的文本摘要,自动为您的通知组创建摘要。
要支持无法显示嵌套通知组的较低版本,您必须另外创建一条通知来充当摘要。这是显示的唯一通知,系统会隐藏所有其他通知。
因此,此摘要应包含所有其他通知的片段,供用户点按以打开您的应用。***
总之:添加这个是为了在不支持通知组的低端设备上,也能展示消息通知给用户。
如需添加通知组摘要,请按以下步骤操作:
4.1、使用通知组说明创建新通知 - 通常最好使用收件箱样式的通知实现此目的。
4.2、通过调用 setGroup() 将摘要通知添加到通知组中。
4.3、通过调用 setGroupSummary(true) 指定将其用作通知组摘要。
//设置摘要通知组
NotificationCompat.Builder summaryNotification = new NotificationCompat.Builder(mActivity, CHANNEL_ID)
.setContentTitle(ettitle)//低版本:标题
.setContentText(etmsg)//低版本:内容
.setAutoCancel(true)//点按通知后自动移除通知。
.setGroup(GROUP_KEY_WORK_EMAIL)//调用 setGroup()并传入通知组名称(将摘要通知添加到通知组中)
.setStyle(new NotificationCompat.InboxStyle()
.setBigContentTitle("new messages")//低版本:展开显示-标题
.addLine(ettitle + " " + etmsg) //低版本:展开显示-内容
.setSummaryText("消息"))//低版本:通知的头部信息
.setGroupSummary(true);//指定将其用作通知组摘要
5.设置通知图标icon
通知组和通知组摘要2个都需要设置图标,这里统一写在一起了。
//设置图标(这里需要做不同Android版本设置)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {// < Android 5.0(21)
//只设置小图标,为app原icon图片。 状态栏和抽屉列表里都显示小图标
builder.setSmallIcon(com.module.libcommon.R.drawable.ic_launcher_yuan);
summaryNotification.setSmallIcon(com.module.libcommon.R.drawable.ic_launcher_yuan);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && // >= Android 5.0(21)并且 < Android 7.0(24)
Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
//设置小图标 和 大图标
//小图标:在状态栏展示,使用图片为背景透明,内容为白色的icon图片。(原因:这部分手机,状态栏图标会显示为白块,只能展示白色icon图片)
//大图标:在抽屉列表展示,设置为app的原icon图片(如果不设置会默认用小图标,并且图片不能适配,不好看)
builder.setSmallIcon(com.module.libcommon.R.drawable.icon_w);
builder.setLargeIcon(ImageUtils.getBitmap("drawable://" + com.module.libcommon.R.drawable.ic_launcher_yuan));
summaryNotification.setSmallIcon(com.module.libcommon.R.drawable.icon_w);
summaryNotification.setLargeIcon(ImageUtils.getBitmap("drawable://" + com.module.libcommon.R.drawable.ic_launcher_yuan));
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && // >= Android 7.0(24)并且 < Android 8.0(26)
Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
//只设置小图标,小图标:用白色内容,透明背景icon图片。 状态栏和抽屉列表里都显示小图标
builder.setSmallIcon(com.module.libcommon.R.drawable.icon_w);
summaryNotification.setSmallIcon(com.module.libcommon.R.drawable.icon_w);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ // >= Android 8.0(26)
//只设置小图标,为app原icon图片。 在状态栏和抽屉列表里都显示app的icon。
// * 这里有个问题是,不管我设置了什么图片做图标,都会展示app的icon作为图标。但是不设置图标使用会报错崩溃的,还要设置。
// * 因为测试机型有限,所以设置为app原icon图片。
builder.setSmallIcon(com.module.libcommon.R.drawable.ic_launcher_yuan);//小图标
summaryNotification.setSmallIcon(com.module.libcommon.R.drawable.ic_launcher_yuan);//小图标
}
6.显示通知
摘要通知 ID 和通知组id,不要写成一样的,不然会没有通知
***Google说明:摘要通知 ID 应保持不变,以便其仅发布一次;这样,如果摘要信息发生更改(后续在通知组中添加通知会使现有摘要发生更新),您就可以之后再对其进行更新。***
//步骤6:显示通知
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mActivity);
notificationManager.notify(notificationId, builder.build());//通知组 ID
notificationManager.notify(SUMMARY_ID, summaryNotification.build());///通知组摘要通知 ID
总结
以上就是今天要讲的内容,本文仅仅简单介绍了标准通知,消息通知,2种情况下的使用。
demo稍后整理完会附上下载链接。