Android通知笔记

作者: NickelFox | 来源:发表于2017-05-24 14:12 被阅读27次

参考:

一. 概念介绍

  • NotificationId
     用来唯一标识一条通知的id,更新通知时候会用到
  • NotificationManager
     用来管理通知的类,一般用来显示(notify),取消(cancel)通知,用getSystemService(Context.NOTIFICATION_SERVICE)方法获取
  • NotificationCompat.Builder
     用来创建通知,并进行一系列设置的类
  • PendingIntent
     一种用来延迟启动Activity、Service、BroadCast的Intent,通过PendingIntent的getXXX获取启动Activity、Service等的PI对象
  • TaskStackBuilder
     创建一个人工的返回栈,用于点击通知之后启动的Activity按返回返回到其父Activity而不是返回到桌面

二. 通知必备的三要素

创建通知必须要有的三要素,说是三要素,但只有小图标是不可缺少的,缺少之后会crash,其他两者缺少的话通知照样能显示

  1. 小图标
     小图标,通过setSmallIcon设置
  2. 标题
     通知标题,通过setContentTitle设置
  3. 详细文本
     通知内容,通过setContentText设置

三. 通知操作

点击通知后进行的操作,常用操作如下:

  1. 打开Activity
    • 利用PendingIntent构建想打开的Activity
    • 调用setContentIntent方法设置PI
  2. 暂停/继续下载
  3. 播放/暂停歌曲
  4. 自定义操作等

四. 通知优先级

通知优先级相当于是一个提示,用来告诉系统用哪种形式显示UI,有五种模式:-2到2;最高级别会以悬浮通知的形式显示

五. 创建简单通知的步骤

  1. 实例化NotificationCompat.Builder对象
  2. 创建点击通知要进行的操作(PendingIntent)
  3. 利用Builder对象对通知进行一系列设置
  4. 实例化NotificationManager对象
  5. 调用NotificationManager对象的notify对象发送通知
mBuilder = new NotificationCompat.Builder(this);//参数为Context的构造函数在android8.0以上版本中已弃用,要用Context,channel的构造函数
        Intent resultIntent = new Intent(this, UpdateActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, REQ_CODE, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                .setContentTitle("Title")
                .setContentText("Hello,World")
                .setContentIntent(pi)
                .setAutoCancel(true);
        mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mManager.notify(NOTIFICATION_ID, mBuilder.build());

六. 带有扩展布局的通知

带有扩展布局的通知可以有一个展开的大视图,MIUI中可以通过双指下滑打开,原生系统中可以直接查看大视图
PS:Android4.1以上才可用,且不同Rom显示效果都不一样,以下截图均为原生效果

  1. 扩展布局种类:

    • InboxStyle:包含一系列String的大视图

      • 方法列表:
        • setBigContentTitle:展开之后的标题
        • setSummaryText :对添加的String数据的总结,下图中的+3more就是
        • addLine:添加一行数据
      • 效果:


        InboxStyle
    • BigPictureStyle

      • 方法列表:
        • setBigContentTitle:下图中的This is big content title
        • setSummaryText:下图中的This is summary text
        • bigLargeIcon:下图中的右上角图标
        • bigPicture:下图中的大图片
      • 效果:


        BigPictureStyle
    • BigTextStyle

      • 方法列表:
        • bigText:要全部显示出来的content内容,下图中一长串文字就是
        • setBigContentTitle:下图中This is big content title
        • setSummaryText:下图中This is summary text
      • 效果:通知显示的时候,对contentText默认是显示在一行的,而内容要是过多则省略,于是就出来了这个Style,会将所有文字都显示出来


        BigTextStyle
    • MediaStyle

      • 注意:在使用该style之前要添加依赖:implementation 'com.android.support:support-media-compat:version'
      • 方法列表:
      • 效果:用来实现音乐播放器的Style
    • MessagingStyle

      • 方法列表:
      • 效果:可以在通知栏里面进行发消息等操作
    • DecoratedCustomViewStyle

      • 方法列表:
      • 效果:由系统装饰的自定义视图的通知样式。自定义通知,但不是完全的自定义,相当于利用系统的装饰进行自定义
    • DecoratedMediaCustomViewStyle

      • 方法列表:
      • 效果:
  2. 创建扩展布局通知的步骤:

    • 和普通通知一样,实例化Builder,设置三要素
    • 新建一个NotificationCompatStyle(Style就是用来设置展开布局的),给Style进行一系列对应的设置
    • 调用Builder.setStyle方法设置style
    • notify进行显示即可

七. 管理通知

八. 8.0通知渠道适配

前言:8.0对通知渠道进行了较为强硬的要求,不带有通知渠道的通知是不会显示的了。因此要创建通知渠道对其进行适配

  1. 创建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //创建了两个通知渠道,聊天信息和推送信息。两个渠道的优先级不同
            createNotificationChannel(CHAT_NOTIFICATION_CHANNEL, "聊天消息", NotificationManager.IMPORTANCE_HIGH);
            createNotificationChannel(SUBSCRIPTION_NOTIFICATION_CHANNEL, "推送信息", NotificationManager.IMPORTANCE_DEFAULT);
        }

/**
     * 创建通知渠道
     * @param id 渠道id,可以为任意字符串。保证全局唯一性即可
     * @param name 通知渠道名称,会显示给用户,用户可以对该渠道进行操作
     * @param importance 通知渠道优先级
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void createNotificationChannel(String id, String name, int importance) {
        NotificationChannel channel = new NotificationChannel(id, name, importance);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.createNotificationChannel(channel);
    }
  1. 创建通知的时候指定通知渠道
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Toast.makeText(this, "8.0以上", Toast.LENGTH_SHORT).show();
            Notification notification = new Notification.Builder(this,CHAT_NOTIFICATION_CHANNEL)//就在这里指定渠道
                    .setSmallIcon(R.mipmap.ic_launcher_round)
                    .setContentTitle("聊天消息")
                    .setContentText("今天中午吃啥")
                    .setWhen(System.currentTimeMillis())
                    .build();
            manager.notify(1, notification);
        } else {
            Toast.makeText(this, "8.0以下", Toast.LENGTH_SHORT).show();
            Notification notification = new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher_round)
                    .setContentTitle("聊天消息")
                    .setContentText("今天中午吃啥")
                    .setWhen(System.currentTimeMillis())
                    .build();
            manager.notify(1, notification);
        }

相关文章

网友评论

    本文标题:Android通知笔记

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