美文网首页
Android Notification通知

Android Notification通知

作者: 徘徊0_ | 来源:发表于2019-12-06 17:03 被阅读0次

    Android官网通知
    通知是Android中经常使用的一个功能,本文记录以8.0版本为分割的通知使用方式,下图为通知栏各个位置的解释:

    Android官方对通知各个位置的解释.png

    一、通知使用

    1,普通通知

    注意:创建通知的时候,需要判断是否为8.0以上,8.0以上需要创建 通知渠道Channel 下面会专门解释通知渠道 , 下面注释解释了创建通知常用的方法

             NotificationManager notificationManager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
             NotificationCompat.Builder builder = null;
            /**
             * 这里需要注意,8.0以上需要创建 Channel 渠道
             */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel notificationChannel = new NotificationChannel("测试渠道", getString(R.string.app_name),
                                NotificationManager.IMPORTANCE_DEFAULT);
                notificationManager.createNotificationChannel(notificationChannel);
                builder = new NotificationCompat.Builder(this,"测试渠道");
            } else {
                builder = new NotificationCompat.Builder(this);
            }
    
            //Ticker是状态栏显示的提示
            builder.setTicker("显示setTicker");
            //第一行内容  通常作为通知栏标题
            builder.setContentTitle("显示setContentTitle");
            //第二行内容 通常是通知正文
            builder.setContentText("这里显示setContentText");
            //第三行内容 通常是内容摘要什么的 在低版本机器上不一定显示
            builder.setSubText("这里显示setSubText!");
            //ContentInfo 在通知的右侧 时间的下面 用来展示一些其他信息
            builder.setContentInfo("这里显示ContentInfo");
            //number设计用来显示同种通知的数量和ContentInfo的位置一样,如果设置了ContentInfo则number会被隐藏
            builder.setNumber(2);
            //true:点击通知栏,通知消失
            builder.setAutoCancel(true);
            //通知时间
            builder.setWhen(System.currentTimeMillis());
            //系统状态栏显示的小图标
            builder.setSmallIcon(R.mipmap.ic_launcher);
            //下拉显示的大图标
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
            /**
             * 这里的Intent可以携带参数传递到跳转的Activity,后面会专门解释
             */
            Intent intent = new Intent(this, NotificationActivity.class);
            PendingIntent pIntent = PendingIntent.getActivity(this, 1, intent, 0);
            //点击跳转的intent
            builder.setContentIntent(pIntent);
            //通知默认的声音 震动 呼吸灯
            builder.setDefaults(NotificationCompat.DEFAULT_ALL);
            Notification notification = builder.build();
            /**
             * 第一个参数为id,如果id相同则该通知会更新;
             */
            notificationManager.notify(123, notification);
    

    上面代码显示结果为:


    常规通知.png
    2,通知样式 Style

    Android中内置了许多通知样式,如下图,都是继承自Style 抽象类,下面介绍三个常用的style:BigTextStyle 、InboxStyle、 BigPictureStyle

    不同通知样式style.png
    • BigTextStyle
      可展开通知 默认情况下,通知的文字内容会被截断以放在一行。如果您想要更长的通知,可以使用builder.setStyle,仅需在上面的代码中加一行代码即可:
        builder.setStyle(new NotificationCompat.BigTextStyle()
                    .bigText("Much longer text that cannot fit one line...Much longer text that cannot fit one line...Much longer text that cannot fit one line...Much longer text that cannot fit one line...Much longer text that cannot fit one line..."));
    
    
    可展开的通知.png
    • InboxStyle可以给通知添加行数进行显示,使用方法也是在上面通知中设置以下代码即可,效果图如下:
     NotificationCompat.Style inboxStyle=new NotificationCompat.InboxStyle()
                    .setBigContentTitle("InboxStyle : ContentTitle")
                    .setSummaryText("InboxStyle; setSummaryText")
                    .addLine("This 1")
                    .addLine("This 2")
                    .addLine("This 3")
                    .addLine("This 4");
            builder.setStyle(inboxStyle);
    
    inboxStyle.png
    • BigPictureStyle,使用bigPicture()在通知中显示一个图片,下图使用了一张默认图来展示
                    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.btn_photo_nor);
                    Bitmap bigPictureBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.default_error);
                    NotificationCompat.Style picStyle=new NotificationCompat.BigPictureStyle()
                            .setBigContentTitle("BigPictureStyle :setBigContentTitle")
                            .setSummaryText("BigPictureStyle : setSummaryText")
                            .bigPicture(bigPictureBitmap)//这张图片会显示在通知中间
                            .bigLargeIcon(bitmap);
    
    BigPictureStyle.png
    3,横幅通知

    介绍横幅通知以前,需要知道一个概念,通知重要性

    image.png
    • 使用横幅通知,需要前往通知设置开启悬浮权限,如下图:

      悬浮权限.png
    • 使用横幅通知,需要在项目的manifest中添加如下权限

        <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
    
    悬浮通知样式.png
    悬浮通知无法弹出排查

    在使用悬浮窗的通知,代码基本跟之前的一样这里不再重复粘贴,仅需要注意权限,如果点击不出现悬浮窗请从以下方式排查:
    1,查看手机设置----->通知管理----->悬浮通知 是否打开!!!!
    2,应用Manifest是否有该<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />权限,(ps:我注释该行也可以弹出,在这里记录一下)
    3,如果上面两步还是弹不出,请设置通知的priority

    builder.setPriority(NotificationCompat.PRIORITY_HIGH);
    

    ps:我再执行步骤1打开了悬浮通知后面的两步不设置也可以弹出, emmmm...

    4,通知渠道

    官网解释如下:


    通知渠道.png

    二,通知使用遇到的问题

    1,通知 点击传递数据 无效
    通知点击通过PendingIntent实现,如下面的代码,PendingIntent.getActivity(this, 1, intent, 0);第四个参数flag开始随便设置了一个值0,但是发现无法将放入intent的参数传递到NotificationActivity.class

            Intent intent = new Intent(this, NotificationActivity.class);
            intent.putExtra("Name", "张三");
            PendingIntent pIntent = PendingIntent.getActivity(this, 1, intent, 0);
    

    解决:问题出在第四个参数flag上,查看官方api,发现最后一个参数参数是int flags,这个值可以是FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT

    • FLAG_CANCEL_CURRENT:如果该PendingIntent已经存在,则在生成新的之前取消当前的。
    • FLAG_NO_CREATE:如果该PendingIntent不存在,直接返回null而不是创建一个PendingIntent.
    • FLAG_ONE_SHOT:该PendingIntent只能用一次,在send()方法执行后,自动取消。
    • FLAG_UPDATE_CURRENT:如果该PendingIntent已经存在,则用新传入的Intent更新当前的数据。

    故只需要将上面代码的第四个参数替换为 FLAG_UPDATE_CURRENT或者FLAG_CANCEL_CURRENT即可。
    第二个参数requestCode,参考:PendingIntent RequestCode参数

    2,通知 点击打开位置不对
    问题:先后发了A,B,C三个通知,点击A通知后收到的是C通知的处理逻辑,代码如下:

    PendingIntent pendingIntent= PendingIntent.getActivity(getContext(), 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
    

    问题还是出在了requestCode 和 flag ,按照顺序发送ABC的时候,后面的会把之前的更新,代码修改后如下:

         PendingIntent pendingIntent= PendingIntent.getActivity(TheApplication.getAppContext(),
                    (int)Math.random()*1000,
                    intent,PendingIntent.FLAG_ONE_SHOT);
    

    相关文章

      网友评论

          本文标题:Android Notification通知

          本文链接:https://www.haomeiwen.com/subject/fkzdgctx.html