赞
踩
目录
1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)
1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)
最近做了一个聊天功能,涉及到了收到消息要通知给用户的部分,需要写一个通知。发现通知我是太久没用了,我知道的实现方法已经不适用了。所以这几天通过Google文档整理了之后可能会常用到的2种情况下使用的通知使用方法:标准通知,消息通知(使用分组)。
也涉及到以下问题:android低版本到高版本手机的通知兼容问题,帮助用户打开通知开关,android5.x手机状态栏icon是白块问题。
条件:Android studio,minSdkVersion = 16,targetSdkVersion = 29
通知图片:需要多制作一个背景透明,内容白色填充的icon,做适配
先创建一个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);
- }
需要创建一个PendingIntent对象,并设置跳转参数
- //步骤2:设置通知的点按操作(跳转的Intent)
- Intent intent = new Intent(mActivity, TwoActivity.class);
- PendingIntent pendingIntent = PendingIntent.getActivity(mActivity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);//FLAG_UPDATE_CURRENT:表示已存在则直接使用
使用 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);//小图标
- }
调用 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” 一样写,然后把importance重要性设置为高等级,这个有响铃。
int importance = NotificationManager.IMPORTANCE_HIGH;//设置渠道重要性, 消息用高等级的,有响铃
和 “标准通知实现步骤 2” 一样写
和 “标准通知实现步骤 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()并传入通知组名称
*** 这个是个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);//指定将其用作通知组摘要
通知组和通知组摘要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);//小图标
- }
摘要通知 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下载链接 https://download.csdn.net/download/u010375874/13755454
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。