通知栏Notification

一般用法,兼容Android O

//第一步:获取状态通知栏管理:

  NotificationManager manager =
          (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  Notification notification = null;
  //第二步:实例化通知栏构造器NotificationCompat.Builder:
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//判断API
      NotificationChannel mChannel = new NotificationChannel(id, name,
              NotificationManager.IMPORTANCE_LOW);
      manager.createNotificationChannel(mChannel);

      notification = new NotificationCompat.Builder(MainActivity.this, id)

              .setContentTitle("这是一个内容标题")//设置通知栏标题
              .setContentText("这是一个内容文本") //设置通知栏显示内容
              .setWhen(System.currentTimeMillis())//通知产生的时间。
              // 会在通知信息里显示,通常是系统获取到的时间
              .setSmallIcon(R.mipmap.ic_launcher)//设置通知小ICON
              .setLargeIcon(BitmapFactory.decodeResource(getResources()
                      , R.mipmap.ic_launcher))//设置通知大ICON
              .build();
  } else {
      NotificationCompat.Builder notificationBuilder =
              new NotificationCompat.Builder(MainActivity.this, id)
                      .setContentTitle("这是一个内容标题")
                      .setContentText("这是一个内容文本")
                      .setSmallIcon(R.mipmap.ic_launcher)
                      .setLargeIcon(BitmapFactory.decodeResource(getResources()
                              , R.mipmap.ic_launcher));
                      // .setOngoing(true);
      notification = notificationBuilder.build();
  }
  //第三步:对Builder进行配置:
  manager.notify(1, notification);

参考:
【Android】23.0 手机多媒体(一)——通知(Notification)(1):状态栏显示通知

【Android】24.0 手机多媒体(二)——通知(Notification)(2):状态栏通知点击事件处理

参数

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
     NotificationChannel notificationChannel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT);
     notificationChannel.canBypassDnd();//可否绕过请勿打扰模式
     notificationChannel.enableLights(true);
     notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);//锁屏显示通知
     notificationChannel.setLightColor(Color.RED);//指定闪光时的灯光颜色
     notificationChannel.canShowBadge();//桌面laucher显示角标
     notificationChannel.enableVibration(true);//是否允许震动
     notificationChannel.getAudioAttributes();//获取系统通知响铃
     notificationChannel.getGroup();//获取通知渠道组
     notificationChannel.setVibrationPattern(new long[]{100, 100, 200});
     notificationChannel.shouldShowLights();//是否会闪光灯



     manager.createNotificationChannel(notificationChannel);


     Notification notification =  Notification.Builder(this)
             .setAutoCancel(true)
             .setChannelId("channel_id")
             .setContentTitle("新消息来来")
             .setContentText("明天放假!")
             .setSmallIcon(R.mipmap.ic_launcher)
             .build();
     //.setStyle(new Notification.BigTextStyle())

     manager.notify(1,builder.build());

更新进度

builder创建同上

 builder.setDefaults(Notification.FLAG_ONLY_ALERT_ONCE);
  manager.notify(2, builder.build());

  new Thread(new Runnable() {
      @Override
      public void run() {
          for (int i = 0; i < 100; i++) {
              try {
                  Thread.sleep(1000);
                  builder.setDefaults(Notification.FLAG_ONLY_ALERT_ONCE);
                  builder.setProgress(100, i, false);

                  manager.notify(2, builder.build());
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
  }).start();

可跳转的通知

/**
     * 发送一个点击跳转到MainActivity的消息
     */
    private void sendSimplestNotificationWithAction() {
        //获取PendingIntent
        Intent mainIntent = new Intent(this, MainActivity.class);
        PendingIntent mainPendingIntent = PendingIntent.getActivity(this, 0, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
     


        NotificationManager manager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = null;
        //第二步:实例化通知栏构造器NotificationCompat.Builder:
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//判断API
            NotificationChannel mChannel = new NotificationChannel(id, name,
                    NotificationManager.IMPORTANCE_LOW);
            manager.createNotificationChannel(mChannel);

            notification = new NotificationCompat.Builder(MainActivity.this, id)

                    .setContentTitle("这是一个内容标题")//设置通知栏标题
                    .setContentText("这是一个内容文本") //设置通知栏显示内容
                    .setWhen(System.currentTimeMillis())//通知产生的时间。
                    // 会在通知信息里显示,通常是系统获取到的时间
                    .setSmallIcon(R.mipmap.ic_launcher)//设置通知小ICON
                    .setLargeIcon(BitmapFactory.decodeResource(getResources()
                            , R.mipmap.ic_launcher))//设置通知大ICON
                    .setContentIntent(mainPendingIntent)
                    .build();
        } else {
            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(MainActivity.this, id)
                            .setContentTitle("这是一个内容标题")
                            .setContentText("这是一个内容文本")
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setLargeIcon(BitmapFactory.decodeResource(getResources()
                                    , R.mipmap.ic_launcher));
            // .setOngoing(true);
            notification = notificationBuilder.build();
        }



        //发送通知
        notifyManager.notify(3, notification);
    }

自定义通知布局(未完善)

/**
     * 自定义通知栏布局
     */
    private void sendCustomNotification(){




        RemoteViews remoteViews  = new RemoteViews(getPackageName(), R.layout.notification_big_layout);
        //remoteViews.setTextViewText(R.id.notification_title,"custom_title");
        //remoteViews.setTextViewText(R.id.notification_content,"custom_content");

        //即将要发生的意图 他是可以被取消 更新
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, -1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //remoteViews.setOnClickPendingIntent(R.id.turn_next, pendingIntent);

        //remoteViews.setOnClickFillInIntent(R.id.turn_next, intent);






        NotificationManager manager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = null;
        //第二步:实例化通知栏构造器NotificationCompat.Builder:
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//判断API
            NotificationChannel mChannel = new NotificationChannel(id, name,
                    NotificationManager.IMPORTANCE_LOW);
            manager.createNotificationChannel(mChannel);

            notification = new NotificationCompat.Builder(MainActivity.this, id)

                    .setContentTitle("这是一个内容标题")//设置通知栏标题
                    .setContentText("这是一个内容文本") //设置通知栏显示内容
                    .setWhen(System.currentTimeMillis())//通知产生的时间。
                    // 会在通知信息里显示,通常是系统获取到的时间
                    .setSmallIcon(R.mipmap.ic_launcher)//设置通知小ICON
                    .setLargeIcon(BitmapFactory.decodeResource(getResources()
                            , R.mipmap.ic_launcher))//设置通知大ICON
                    .setCustomContentView(remoteViews)
                    .build();
        } else {
            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(MainActivity.this, id)
                            .setContentTitle("这是一个内容标题")
                            .setContentText("这是一个内容文本")
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setLargeIcon(BitmapFactory.decodeResource(getResources()
                                    , R.mipmap.ic_launcher))
                    .setCustomContentView(remoteViews);
            // .setOngoing(true);
            notification = notificationBuilder.build();
        }


        manager.notify(3,notification);


    }

通知栏Notification点击,取消,清除响应事件(未实现,通知栏的处理还是有很多内容!有时间再搞)

通知栏Notification点击,取消,清除响应事件

跳转通知栏设置中心

/**
     * 前往设置中心
     *
     * @param activity 上下文
     * @param requestCode 请求码 用来传给startActivityForResult作为回调标识符,不需要回调处理的不用设置,跳转直接用startActivity即可
     */
    public void startAppSetting(Activity activity, int requestCode) {
        try {
            // 根据isOpened结果,判断是否需要提醒用户跳转AppInfo页面,去打开App通知权限
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
            if(android.os.Build.VERSION.SDK_INT  >= Build.VERSION_CODES.LOLLIPOP){
                //这种方案适用于 API 26, 即8.0(含8.0)以上可以用
                intent.putExtra(EXTRA_APP_PACKAGE, activity.getPackageName());
                intent.putExtra(EXTRA_CHANNEL_ID, activity.getApplicationInfo().uid);
                //这种方案适用于 API21——25,即 5.0——7.1 之间的版本可以使用
                intent.putExtra("app_package", activity.getPackageName());
                intent.putExtra("app_uid", activity.getApplicationInfo().uid);
            } else {
                //4.4以下没有从app跳转到应用通知设置页面的Action,可考虑跳转到应用详情页面,
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                if (Build.VERSION.SDK_INT >= 9) {
                    intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                    intent.setData(Uri.fromParts("package", activity.getPackageName(), null));
                } else if (Build.VERSION.SDK_INT <= 8) {
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setClassName("com.android.settings", "com.android.setting.InstalledAppDetails");
                    intent.putExtra("com.android.settings.ApplicationPkgName", activity.getPackageName());
                }
            }
            activity.startActivityForResult(intent,requestCode);
        } catch (Exception e) {
            e.printStackTrace();
            // 出现异常则跳转到应用设置界面:锤子坚果3——OC105 API25
            Intent intent = new Intent();
            //下面这种方案是直接跳转到当前应用的设置界面。
            //https://blog.csdn.net/ysy950803/article/details/71910806
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
            intent.setData(uri);
            activity.startActivityForResult(intent,requestCode);
        }
    }

参考:
安卓8.0后通知栏Notification【判断APP通知栏权限是否开启,以及关闭了通知权限后设置或者自定义通知栏消息显示】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容