Android Notification通知 发送消息通知时的用法 兼容高低版本 demo下载

目录

 

前言

一、基本通知实现步骤

1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)

2.设置点击通知跳转activity

3.创建通知,设置图标

4.显示通知

二、消息通知实现步骤(使用分组)

1.创建通知渠道,并设置重要性(这个8.0及以上必须需要设置的内容,才能提供通知)

2.设置点击通知跳转activity

3.创建通知组并为其添加通知

4.设置通知组摘要

5.设置通知图标icon

6.显示通知

总结


前言

最近做了一个聊天功能,涉及到了收到消息要通知给用户的部分,需要写一个通知。发现通知我是太久没用了,我知道的实现方法已经不适用了。所以这几天通过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稍后整理完会附上下载链接。

上一篇:Android Notification(通知)(含兼容问题)


下一篇:Asp.Net Core 使用 MediatR