一直也没有写过通知栏的用法,今天学习正好看到这里,所以在这里进行一下总结。

1.Notification.Builder的相关方法

  • setWhen:设置推送时间,格式为“小时:分钟”。推送时间在通知栏右方显示。
  • setShowWhen:设置是否显示推送时间。
  • setUsesShronometer:设置是否显示计时器。为true时不显示推送时间,动态显示从通知被推送到当前的时间间隔,以“分钟:秒钟”格式显示。
  • setSmallIcon:设置状态栏里面的图标(小图标)。
  • setTicker:设置状态栏里面的提示文字。
  • setLargeIcon:设置通知栏里面的图标(大图标)。
  • setContentTitle:设置通知栏里面的标题文字。
  • setContentText:设置通知栏里面的内容文本。
  • setSubText:设置通知栏里面的附加说明文本,位于内容文本下方。若调佣该方法,则setProgress的设置失效。
  • setProgress:设置进度条与当前进度。进度条位于标题文本与内容文本中间。
  • setNumber:设置通知栏右下方的数字,可与setProgress联合使用,表示当前的进度数值。
  • setContentInfo:设置通知栏右下方的文本。若调用该方法,则setNumber的设置失效。
  • setContentIntent:设置内容的延迟意图PendingIntent,点击该通知触发该意图。通常调用PendingIntent的getActivity方法获得延迟意图对象,getActivity表示点击后跳转到该页面。
  • setDeleteIntent:设置删除的延迟意图PendingIntent,滑掉该通知时触发该动作。
  • setAutoCancel:设置该通知是否自动清除。若为true,则点击通知后,通知会自动消失,若为flase,则点击该通知后,通知不会消失。
  • setContent:设置一个定制的通知栏视图RemoteViews,用于取代Builder的默认视图模板。
  • build:构建方法。在以上参数都设置完毕后,调用该方法返回Notification对象。

2.上述方法使用注意事项

  • setSmallIcon方法必须调用,否则不会显示通知消息。
  • setWhen与setUsesChronometer同时只能调用其中一个,即推送时间与计数器无法同时显示,因为它们都位于通知栏右边。
  • setSubText与setProgress同时只能调用其中一个,因为附加说明与进度条都位于标题文本下方。
  • setNumber与setContentInfo同时只能调用其中一个,因为计数值与提示都位于通知栏右下方。

3.NotificationManager的相关方法

  • notify:推送指定消息到通知栏
  • cancel:取消指定消息。调用该方法后,通知栏中的指定消息将消失
  • cancelAll:取消所有消息(待续)

4.普通消息示例

private void sendSimpleNotify(String title,String message){
        count++;
        //从系统服务中获取通知管理器
        NotificationManager notifyMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //调用后只有8.0以上执行
        createNotifyChannel(notifyMgr,this,"channel_id");
        //创建一个跳转到活动页面的意图
        Intent clickIntent = new Intent(this,MessageActivity.class);
        clickIntent.putExtra("flag",count);
        //创建一个用于页面跳转的延迟意图
        PendingIntent contentIntent = PendingIntent.getActivity(this,count,clickIntent
                ,PendingIntent.FLAG_UPDATE_CURRENT);
        //创建一个通知消息的构造器
        Notification.Builder builder = new Notification.Builder(this);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            //Android8.0开始必须给每个通知分配对应的渠道
            builder = new Notification.Builder(this,"channel_id");
        }
        builder.setContentIntent(contentIntent)//设置内容的点击意图
                .setAutoCancel(true)//设置是否允许自动清除
                .setSmallIcon(R.mipmap.ic_launcher)//设置状态栏里的小图标
                .setTicker("提示消息来啦")//设置状态栏里面的提示文本
                .setWhen(System.currentTimeMillis())//设置推送时间,格式为"小时:分钟"
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))//设置通知栏里面的大图标
                .setContentTitle(title)//设置通知栏里面的标题文本
                .setContentText(message);//设置通知栏里面的内容文本
        //根据消息构造器创建一个通知对象
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            Notification notify = builder.build();
            //使用通知管理器推送通知,然后在手机的通知栏就会看到消息
            notifyMgr.notify(count,notify);
        }
    }

    /**
     * 创建通知渠道,Android8.0开始必须给每个通知分配对应的渠道
     * @param notifyMgr
     * @param ctx
     * @param channelId
     */
    private void createNotifyChannel(NotificationManager notifyMgr,Context ctx,String channelId){
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            //创建一个默认重要性的通知渠道
            NotificationChannel channel = new NotificationChannel(channelId,"Channel",NotificationManager.IMPORTANCE_DEFAULT);
            channel.setSound(null,null);
            channel.setShowBadge(true);
            channel.canBypassDnd();//可否绕过请勿打扰模式
            channel.enableLights(true);//闪光
            channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);//锁屏显示通知
            channel.setLightColor(Color.RED);//指定闪光时的灯光颜色
            channel.canShowBadge();//桌面ICON是否可以显示角标
            channel.enableVibration(true);//是否可以震动
            channel.getGroup();//获取通知渠道组
            channel.setVibrationPattern(new long[]{100,100,200});//震动的模式
            channel.shouldShowLights();//是否会闪光
            notifyMgr.createNotificationChannel(channel);
        }
    }

这里注意我们用到一个count的变量,用来区分每一条消息,所以count一定要有变化,否则回覆盖掉之前的一条。

5.计时消息示例

private void sendSimpleNotify(String title,String message){
        count++;
        //从系统服务中获取通知管理器
        NotificationManager notifyMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //调用后只有8.0以上执行
        createNotifyChannel(notifyMgr,this,"channel_id");
        //创建一个跳转到活动页面的意图
        Intent clickIntent = new Intent(this,MessageActivity.class);
        clickIntent.putExtra("flag",count);
        //创建一个用于页面跳转的延迟意图
        PendingIntent contentIntent = PendingIntent.getActivity(this,count,clickIntent
                ,PendingIntent.FLAG_UPDATE_CURRENT);
        //创建一个通知消息的构造器
        Notification.Builder builder = new Notification.Builder(this);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //Android8.0开始必须给每个通知分配对应的渠道
            builder = new Notification.Builder(this,"channel_id");
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            builder.setContentIntent(contentIntent)//设置内容的点击意图
                    .setAutoCancel(false)//设置是否允许自动清除
                    .setUsesChronometer(true)//设置是否显示计数器
                    .setProgress(100,60,false)//设置进度条与当前进度
                    .setNumber(99)//设置通知栏右下方的数字
                    .setSmallIcon(R.mipmap.ic_launcher)//设置状态栏里的小图标
                    .setTicker("提示消息来啦")//设置状态栏里面的提示文本
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))//设置通知栏里面的大图标
                    .setContentTitle(title)//设置通知栏里面的标题文本
                    .setContentText(message);//设置通知栏里面的内容文本
            //根据消息构造器创建一个通知对象
            Notification notify = builder.build();
            //使用通知管理器推送通知,然后在手机的通知栏就会看到消息
            notifyMgr.notify(count,notify);
        }
    }

    /**
     * 创建通知渠道,Android8.0开始必须给每个通知分配对应的渠道
     * @param notifyMgr
     * @param ctx
     * @param channelId
     */
    private void createNotifyChannel(NotificationManager notifyMgr,Context ctx,String channelId){
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            //创建一个默认重要性的通知渠道
            NotificationChannel channel = new NotificationChannel(channelId,"Channel",NotificationManager.IMPORTANCE_DEFAULT);
            channel.setSound(null,null);
            channel.setShowBadge(true);
            channel.canBypassDnd();//可否绕过请勿打扰模式
            channel.enableLights(true);//闪光
            channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);//锁屏显示通知
            channel.setLightColor(Color.RED);//指定闪光时的灯光颜色
            channel.canShowBadge();//桌面ICON是否可以显示角标
            channel.enableVibration(true);//是否可以震动
            channel.getGroup();//获取通知渠道组
            channel.setVibrationPattern(new long[]{100,100,200});//震动的模式
            channel.shouldShowLights();//是否会闪光
            notifyMgr.createNotificationChannel(channel);
        }
    }

通知相关的内容今天就说这么多了。如果小伙伴们有疑问可以在评论区和我讨论。