9.0 自定义SystemUI下拉状态栏和通知栏视图(十五)之悬浮通知布局

1.前言

在进行9.0的系统rom产品定制化开发中,在9.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能,

所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删除通知的部分功能,接下来就来实现第十五部分关于实现systemui关于悬浮

通知的相关布局实现

效果图如图:

2. 自定义SystemUI下拉状态栏和通知栏视图(十五)之悬浮通知布局的核心类

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java

3.自定义SystemUI下拉状态栏和通知栏视图(十五)之悬浮通知布局的核心功能分析和实现

在9.0的systemui系统中的悬浮通知也是调用的下拉状态栏的相关的悬浮通知来显示悬浮通知的,所以也需要监听系统关于悬浮通知的相关流程,然后

在这里添加自定义的悬浮通知的接口,首先需要实现对悬浮通知的监听

3.1NotificationInflater.java 弹窗类型分析

public class NotificationInflater {
 
       public void inflateNotificationViews() {
          inflateNotificationViews(FLAG_REINFLATE_ALL);
      }
  
      /**
       * Reinflate all views for the specified flags on a background thread. This is asynchronous and
       * will notify the callback once it's finished.
       *
       * @param reInflateFlags flags which views should be reinflated. Use {@link #FLAG_REINFLATE_ALL}
       *                       to reinflate all of views.
       */
      @VisibleForTesting
      void inflateNotificationViews(int reInflateFlags) {
          if (mRow.isRemoved()) {
              // We don't want to reinflate anything for removed notifications. Otherwise views might
              // be readded to the stack, leading to leaks. This may happen with low-priority groups
              // where the removal of already removed children can lead to a reinflation.
              return;
          }
          StatusBarNotification sbn = mRow.getEntry().notification;
          AsyncInflationTask task = new AsyncInflationTask(sbn, reInflateFlags, mRow,
                  mIsLowPriority,
                  mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient,
                  mCallback, mRemoteViewClickHandler);
          if (mCallback != null && mCallback.doInflateSynchronous()) {
              task.onPostExecute(task.doInBackground());
          } else {
              task.execute();
          }
      }
  
      @VisibleForTesting
      InflationProgress inflateNotificationViews(int reInflateFlags,
              Notification.Builder builder, Context packageContext) {
          InflationProgress result = createRemoteViews(reInflateFlags, builder, mIsLowPriority,
                  mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight,
                  mRedactAmbient, packageContext);
          apply(result, reInflateFlags, mRow, mRedactAmbient, mRemoteViewClickHandler, null);
          return result;
      }

通过NotificationInflater.java中的上述几个常量发现那就是通知的几种类型 而弹窗通知具体是由NotificationAlertingManager来管理NotificationAlertingManager 构造函数中给NotificationEntryManager 加 NotificationEntryListener ,

以便在通知视图首次填充(onEntryInflated) 时 感知并弹出悬浮通知。

而在NotificationAlertingManager.java 负责管理弹出悬浮通知,接下来分析下NotificationAlertingManager.java悬浮通知的方法

3.2 NotificationEntryManager.java 弹窗通知分析

  public NotificationEntryManager(Context context) {
          mContext = context;
          mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
          mBarService = IStatusBarService.Stub.asInterface(
                  ServiceManager.getService(Context.STATUS_BAR_SERVICE));
          mMessagingUtil = new NotificationMessagingUtil(context);
          mSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
          mGroupManager.setPendingEntries(mPendingNotifications);
          mFGSExtender.setCallback(key -> removeNotification(key, mLatestRankingMap));
      }
 private void addEntry(NotificationData.Entry shadeEntry) {
          boolean isHeadsUped = shouldPeek(shadeEntry);
          if (isHeadsUped) {
              mHeadsUpManager.showNotification(shadeEntry);
+                Log.e("NotificationPanelViewController", "entry:"+ entry.notification);
+                if(shadeEntry.notification!=null)NotificationHelper.getInstance().addAlertNotification(shadeEntry.notification);
              // Mark as seen immediately
              setNotificationShown(shadeEntry.notification);
          }
          addNotificationViews(shadeEntry);
          mCallback.onNotificationAdded(shadeEntry);
      }

通过NotificationEntryManager.java上述代码发现

addEntry(NotificationData.Entry shadeEntry) 就是监听悬浮通知的 所以在addEntry(NotificationData.Entry shadeEntry)

就是负责悬浮通知弹窗的相关方法,所以在这里增加自定义的悬浮通知回调方法

NotificationHelper.getInstance().addAlertNotification(shadeEntry.notification);;然后在NotificationPanelView.java中接收自定义悬浮

通知,然后显示悬浮通知

3.3 NotificationPanelView.java关于显示悬浮通知的相关方法

 public class NotificationPanelView extends PanelView implements
+        com.android.systemui.notification.NotificationListener,
          ExpandableView.OnHeightChangedListener,

+    private com.android.systemui.notification.NotificationEntry mNotificationEntry;
+    @Override
+    public void addAlertNotification(StatusBarNotification sbn) {
+        Log.e("NotificationPanelViewController", "addAlertNotification:packageName=" + sbn.getPackageName());
+        try {
+            Notification notification = sbn.getNotification();
+            String packageName = sbn.getPackageName();
+            long when = notification.when;
+            Bundle bundle = notification.extras;
+            String title = bundle.getString("android.title");
+            String content = bundle.getString("android.text");
+            Log.e("NotificationPanelViewController", "addAlertNotification-packageName:" + "-----" + packageName+"--notification:"+notification);
+            Log.e("NotificationPanelViewController", "addAlertNotification-tickerText:" + "------" + notification.tickerText);
+            Log.e("NotificationPanelViewController", "addAlertNotification-title:" + "-----" + notification.extras.get("android.title"));
+            Log.e("NotificationPanelViewController", "addAlertNotification-text:" + "-----" + notification.extras.get("android.text"));
+                       if(TextUtils.isEmpty(title)&&TextUtils.isEmpty(content))return;
+            PackageManager pm = getContext().getPackageManager();
+            ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
+            mNotificationEntry = new com.android.systemui.notification.NotificationEntry();
+            mNotificationEntry.setNotification_content(content);
+            mNotificationEntry.setNotification_title(title);
+            mNotificationEntry.setPackageName(packageName);
+                       mNotificationEntry.setStatusBarNotification(sbn);
+            if (applicationInfo != null) {
+                mNotificationEntry.setmAppName(pm.getApplicationLabel(applicationInfo).toString());
+                mNotificationEntry.setmAppDrawable(pm.getApplicationIcon(applicationInfo));
+            } else {
+                if (packageName.equals("android")) mNotificationEntry.setmAppName("Android 系统");
+            }
+                       mSwipeMeunListView.setVisibility(mBarState == StatusBarState.KEYGUARD?View.GONE:View.VISIBLE);
+               } catch (Exception e) {
+            e.printStackTrace();
+        }
+       }

在NotificationPanelView.java的上述方法中,通过增加addAlertNotification(StatusBarNotification sbn)接口来实现接收悬浮通知的相关布局

中,添加到显示悬浮通知的列表中,

@@ -2667,12 +2934,23 @@ public class NotificationPanelView extends PanelView implements
     public void onHeadsUpPinnedModeChanged(final boolean inPinnedMode) {
         mNotificationStackScroller.setInHeadsUpPinnedMode(inPinnedMode);
         if (inPinnedMode) {
+            ArrayList<com.android.systemui.notification.NotificationEntry> alertNotification = new ArrayList<>();
+                       if(mNotificationEntry!=null)alertNotification.add(mNotificationEntry);
+            mNFDataAdapter = new NotificationDataAdapter(alertNotification, getContext());
+            mSwipeMeunListView.setAdapter(mNFDataAdapter);
             mHeadsUpExistenceChangedRunnable.run();
             updateNotificationTranslucency();
         } else {
             setHeadsUpAnimatingAway(true);
             mNotificationStackScroller.runAfterAnimationFinished(
                     mHeadsUpExistenceChangedRunnable);
+                       mKeyguardBottomArea.postDelayed(new Runnable() {
+              @Override
+              public void run() {
+                            mNFDataAdapter = new NotificationDataAdapter(mAllNotification, getContext());
+                 mSwipeMeunListView.setAdapter(mNFDataAdapter);
+                         }
+            },2000);
         }
     }

在NotificationPanelView.java的上述方法中,通过 onHeadsUpPinnedModeChanged(final boolean inPinnedMode)中,根据inPinnedMode的值来判断

当前悬浮通知是否显示和隐藏,当为true时表示悬浮通知弹窗,这时候就更新显示悬浮通知列表,

当inPinnedMode为false 就是悬浮通知消失的时候,这时候也是延时刷新悬浮通知列表,通过上面布局的修改

就可以实现在NotificationPanelView.java中,通过在悬浮通知弹窗的时候,来刷新自定义通知列表来实现功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【jenkins部署】一文弄懂自动打包部署(前后台)

这里写目录标题序言软件安装jdkmaven配置maven阿里镜像以及本地库位置git安装安装jenkins插件安装环境配置创建项目配置gitee生成gitee WebHookmaven打包验证是否打包成功连接远程服务器并重启服务远程服务器生成私钥配置ssh项目配置ssh脚本vue项目打包nodejs安装下载配置环境变…

【C++进阶】位图和布隆过滤器

文章目录位图位图概念位图使用场景位图的结构构造setresettest完整代码布隆过滤器布隆过滤器概念布隆过滤器结构构造setresettest完整版代码位图 位图概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用…

智能火焰与烟雾检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;智能火焰与烟雾检测系统用于智能日常火灾检测报警&#xff0c;利用摄像头画面实时识别火焰与烟雾&#xff0c;另外支持图片、视频火焰检测并进行结果可视化。本文详细介绍基于智能火焰与烟雾检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的…

【数据结构与算法】设计循环队列

文章目录&#x1f451;前言如何设计循环队列设计循环队列整体的代码&#x1f4ef;写在最后&#x1f451;前言 &#x1f6a9;前面我们 用队列实现了一个栈 &#xff0c;用栈实现了一个队列 &#xff0c;相信大家随随便便轻松拿捏&#xff0c;而本章将带大家上点难度&#xff0c;…

【Linux】SIGCHLD信号

文章目录SIGCHLD信号SIGCHLD信号 回忆: 为了避免出现僵尸进程,父进程需要使用wait或waitpid函数等待子进程结束,父进程可以阻塞等待子进程结束,也可以非阻塞地查询的是否有子进程结束等待清理,即轮询的方式 如果采用阻塞等待:父进程阻塞就不能处理自己的工作了如果采用非阻塞等…

Python日志logging实战教程

一、什么是日志 在《网络安全之认识日志采集分析审计系统》中我们认识了日志。日志数据的核心就是日志消息或日志&#xff0c;日志消息是计算机系统、设备、软件等在某种刺激下反应生成的东西。 日志数据&#xff08;log data&#xff09;就是一条日志消息的内在含义&#xf…

第十四届蓝桥杯第三期模拟赛 【python】

第十四届蓝桥杯第三期模拟赛 【python】 文章目录第十四届蓝桥杯第三期模拟赛 【python】✨最小的十六进制&#xff08;python的16进制&#xff09;❓️问题描述答案提交&#x1f9e0;思路&#x1f5a5;︎参考答案✨Excel的列&#xff08;进制转化&#xff09;❓️问题描述答案…

串口通信(STM32演示实现)

目录 一、串行通信的概念 二、寄存器 2.1控制寄存器USART_CR1 2.2控制寄存器USART_CR2​编辑 2.3串口寄存器USART_BRR 2.4 USART_ISR 2.5USART_TDR 2.6USART_RDR​编辑 三、实现串口数据的收发 一、串行通信的概念 u通信&#xff0c;最少要有两个对象&#xff0c;一个收…

强化学习、监督学习、无监督学习是什么

1 强化学习 1.1 定义 强化学习是机器学习学习方式的一种&#xff0c;是让计算机实现从一开始完全随机的进行操作&#xff0c;通过不断试错的方式去总结出每一步的最佳行为决策&#xff0c;基于环境给予的反馈&#xff0c;去调整自己的行为决策&#xff0c;从而对未来的行为给…

什么是推挽输出,开漏输出?

这篇文章是看B站“工科男孙老师”这个视频的笔记推挽 开漏 高阻 这都是谁想出来的词&#xff1f;&#xff1f; 我觉得讲的很好&#xff0c;做一下笔记 1.什么是IO输出三态 一共有&#xff1a;高电平, 低电平&#xff0c;浮空/高阻态 三种IO态 2.推挽输出 推挽输出能够表示高、…

短链接是怎么设计的?带你入门

文章目录前言一、短链1、原理1.1 短链生成原理1.2 短链跳转原理&#xff1a;2、设计&#xff1a;2.1 短链需求2.2 考虑的问题&#xff1f;二、实践案例1、设计表&#xff1a;2、生成短链&#xff1a;前言 说到 URL 你肯定不陌生&#xff0c;浏览器输入一段 URL&#xff0c;立马…

QMessageBox手动添加按钮并绑定按钮的信号

视频展示效果&#xff08;结合代码看效果更佳哦&#xff0c;代码在最下面&#xff09;&#xff1a; QMessageBox手动添加有重试效果的按钮效果图&#xff1a; 点击详细文本之后展开如下图&#xff1a; 图标可选&#xff1a; QMessageBox::Critical错误图标QMessageBox::NoIco…

第二十一天 数据库开发-MySQL

目录 数据库开发-MySQL 前言 1. MySQL概述 1.1 安装 1.2 数据模型 1.3 SQL介绍 1.4 项目开发流程 2. 数据库设计-DDL 2.1 数据库操作 2.2 图形化工具 2.3 表操作 3. 数据库操作-DML 3.1 增加(insert) 3.2 修改(update) 3.3 删除(delete) 数据库开发-MySQL 前言 …

深度学习:GPT1、GPT2、GPT-3

深度学习&#xff1a;GPT1、GPT2、GPT3的原理与模型代码解读GPT-1IntroductionFramework自监督学习微调ExperimentGPT-2IntroductionApproachConclusionGPT-3GPT-1 Introduction GPT-1&#xff08;Generative Pre-training Transformer-1&#xff09;是由OpenAI于2018年发布的…

从0到1深度学习环境搭建

目录第一步&#xff1a;安装anaconda第二步&#xff1a;创建一个虚拟环境试一下第三步&#xff1a;确定cuda算力&#xff0c;配置cudapytorch官网找版本pycharm配置pycharm进行设置setting 能够打开conda的shell终端如何给下载的项目设置合适的环境如果必须要低版本的pytorch才…

智驾芯片“性价比之王”凭何抢滩增量市场?

未来几年&#xff0c;智能驾驶功能将进入跨越式升级的阶段&#xff0c;同时L2将快速普及&#xff0c;L2进入集中放量的阶段。 包括自动泊车 (APA)、家庭区域记忆泊车 (HAVP)、交通拥堵辅助 (TJA)、高速辅助驾驶 (HWA)、自动辅助导航驾驶 (NOA) 等在内的功能已为普通车主耳熟能…

美颜sdk的动态面具、3D面具实现流程

在美颜sdk的实现中&#xff0c;面具是很重要的一个部分&#xff0c;不管是动态面具还是3D面具都需要实现的&#xff0c;我们在开发中常用的是动态面具和3D面具。但是两种面具有很多不同之处&#xff0c;比如制作材料、制作方式等等。在这里我们先来了解一下动态面具和3D面具是如…

8个不能错过的程序员必备网站,惊艳到我了!!!

程序员是一个需要不断学习的职业&#xff0c;不少朋友每天来逛CSDN、掘金等网站&#xff0c;但一直都抱着“收藏从未停止&#xff0c;学习从未开始”的态度&#xff0c;别骗自己了兄弟。在编程体系中&#xff0c;有很多不错的小工具&#xff0c;可以极大得提升我们的开发效率。…

电容在微分、积分电路中的本质以及应用

很多朋友觉得PID是遥不可及&#xff0c;很神秘&#xff0c;很高大上的一种控制&#xff0c;对其控制原理也很模糊&#xff0c;只知晓概念性的层面&#xff0c;知其然不知其所以然&#xff0c;那么本期从另类视角来探究微分、积分电路的本质&#xff0c;意在帮助理解PID的控制原…

第十四届蓝桥杯三月真题刷题训练——第 21 天

目录 第 1 题&#xff1a;灭鼠先锋 问题描述 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;小蓝与钥匙 问题描述 答案提交 运行限制 代码&#xff1a; 思路 : 第 3 题&#xff1a;李白打酒加强版 第 4 题&#xff1a;机房 第 1 题&#xff1…
最新文章