Android Notification通知

2019-12-06  本文已影响0人  徘徊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
    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
 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
                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
    <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_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);
上一篇下一篇

猜你喜欢

热点阅读