隐藏状态栏icon闹钟的显示

设置闹钟后在状态栏ICON区域会显示一个闹钟小图标,我们实现设置闹钟后让它不显示。
参考博客:https://blog.csdn.net/weixin_33881140/article/details/92024232
通过SystemUi的加载流程,我们知道有这么一个方法makeStatusBarView(result)
是创建状态栏的,找到如下代码

这里的代码主要实现了:

  1. 使用 CollapsedStatusBarFragment 替换 status_bar_container(状态栏通知显示区域, status_bar_container在xml文件super_status_bar.xml文件中)
  2. statusBarFragment.initNotificationIconArea(mNotificationIconAreaController) 初始化通知栏区域
  3. mStatusBarView.setBar(this) 传递statusBar处理下拉事件和mStatusBarView.setPanel(mNotificationPanel) 传递 NotificationPanelView 显示下拉UI控制

看CollapsedStatusBarFragment
在视图创建后,需要创建图标,下面这里是status_icon的创建,也就是CollapsedStatusBarFragment 类
CollapsedStatusBarFragment的onCreateView方法:

下面是视图的创建,将status_bar.xml显示创建视图到CollasedStatusBarFragment中
我们先聚集在system_icon_area区域,就是显示蓝牙、wifi、VPN、网卡icon那块区域:

   @Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);mStatusBar = (PhoneStatusBarView) view;if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_PANEL_STATE)) {mStatusBar.restoreHierarchyState(savedInstanceState.getSparseParcelableArray(EXTRA_PANEL_STATE));}.......mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons),Dependency.get(CommandQueue.class));mDarkIconManager.setShouldLog(true);Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);mClockView = mStatusBar.findViewById(R.id.clock);showSystemIconArea(false);showClock(false);initEmergencyCryptkeeperText();initOperatorName();}

我们发现了这几行代码:
1、mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons),
Dependency.get(CommandQueue.class)); //R.id.statusIcons即是system_icons.xml里面的控件。

system_icons.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:systemui="http://schemas.android.com/apk/res-auto"android:id="@+id/system_icons"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical"><com.android.systemui.statusbar.phone.StatusIconContainerandroid:id="@+id/statusIcons"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:paddingEnd="@dimen/signal_cluster_battery_padding"android:gravity="center_vertical"android:orientation="horizontal"/><com.android.systemui.BatteryMeterView android:id="@+id/battery"android:layout_height="match_parent"android:layout_width="wrap_content"android:clipToPadding="false"android:clipChildren="false"systemui:textAppearance="@style/TextAppearance.StatusBar.Clock" />
</LinearLayout>

2、Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager); //进入其实现类StatusBarIconControllerImpl.java,在其构造函数中我们找到了实现

public StatusBarIconControllerImpl(Context context) {super(context.getResources().getStringArray(com.android.internal.R.array.config_statusBarIcons));

我们可以发现状态栏icon加载的图标来源于framework/base/core/res/res/values/config.xml文件
在这里我们就找到了index和slot的出处,原来在初始化的时候就已经定义好了所有的slots,然后从framework中加载出来,index就是string-array中的顺序。

   <string-array name="config_statusBarIcons"><item><xliff:g id="id">@string/status_bar_alarm_clock</xliff:g></item><item><xliff:g id="id">@string/status_bar_rotate</xliff:g></item><item><xliff:g id="id">@string/status_bar_headset</xliff:g></item><item><xliff:g id="id">@string/status_bar_data_saver</xliff:g></item><item><xliff:g id="id">@string/status_bar_ime</xliff:g></item><item><xliff:g id="id">@string/status_bar_sync_failing</xliff:g></item><item><xliff:g id="id">@string/status_bar_sync_active</xliff:g></item>................</string-array><string translatable="false" name="status_bar_rotate">rotate</string><string translatable="false" name="status_bar_headset">headset</string><string translatable="false" name="status_bar_data_saver">data_saver</string><string translatable="false" name="status_bar_managed_profile">managed_profile</string><string translatable="false" name="status_bar_ime">ime</string><string translatable="false" name="status_bar_sync_failing">sync_failing</string><string translatable="false" name="status_bar_sync_active">sync_active</string>.......

然后是StatusBarIconControllerImpl.java这个控制器来控制icon的加载显示和移除。
由PhoneStatusBarPolicy.java类来负责调用执行:
有2种方式实现对ICON的控制显示和隐藏
1、首先类本身实现了大量的回调接口,通过重写这些接口类的方法,会在触发的时候被回调,然后更新ICON显示和隐藏

public class PhoneStatusBarPolicyimplements BluetoothController.Callback,CommandQueue.Callbacks,RotationLockControllerCallback,Listener,ZenModeController.Callback,DeviceProvisionedListener,KeyguardStateController.Callback,LocationController.LocationChangeCallback,RecordingController.RecordingStateChangeCallback,TrainController.Callback{...

2、在初始化的时候又注册了大量的监听,能够监听广播进行调节改变显示

public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController) {mContext = context;//  初始化headset的slotmSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset);// listen for broadcastsIntentFilter filter = new IntentFilter();filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);//  注册headset状态变化的actionfilter.addAction(AudioManager.ACTION_HEADSET_PLUG);filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);

依靠监听和回调机制,可以用来控制状态栏icon图标的显示、隐藏。在PhoneStatusBarPolicy.java中来实现,下面我们以闹钟为例,我们不希望设置闹钟之后状态栏显示闹钟icon。每个icon对应一个updatexxx(),我们找到关于闹钟的updateAlarm()

   private void updateAlarm() {final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;int zen = mZenController.getZen();final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS;mIconController.setIcon(mSlotAlarmClock, zenNone ? R.drawable.stat_sys_alarm_dim: R.drawable.stat_sys_alarm, buildAlarmContentDescription());//mIconController.setIconVisibility(mSlotAlarmClock, mCurrentUserSetup && hasAlarm);//jiaxian.zhang 直接修改为falsemIconController.setIconVisibility(mSlotAlarmClock, false);}

修改后push到手机发现成功实现!

Android11 状态栏icon图标的显示流程相关推荐

  1. 解决网页ICON图标无法显示的问题

    解决网页ICON图标无法显示的问题 参考文章: (1)解决网页ICON图标无法显示的问题 (2)https://www.cnblogs.com/ziyoublog/p/10974406.html 备忘 ...

  2. elementPlus使用icon图标不显示解决方法

    近期在学习Vue时用elementUI时发现icon在页面上显示不出来,根据官方文档上的用法都显示不出来,听说在文档更新后好像不可以直接使用,需要引用. 正常按照文档标签使用(icon图标未显示) & ...

  3. vue项目 - svg格式的icon图标无法显示颜色

    前言 在项目中遇到svg格式的icon图标无法显示颜色,这个问题.尝试过很多方法,最后发现不是代码的问题,而是iconfont图标库中没有配置好. 1. 发现问题如下 当点击菜单选项时,icon和文字 ...

  4. vant使用遇到icon图标不显示,显示为方块□□□□□

    vant使用遇到icon图标不显示,显示为方块□□□□□ 现象 搜索找到的方法 最终找到原因: 最终现象 现象 <van-icon name="chat-o" /> & ...

  5. Elementui icon图标不显示

    文章目录 需求 原理 实现 效果 icon图标链接 需求 需要实现显示icon图标 原理 不显示的原因是项目中引入的element-ui的版本过低了,低版本的icon中没有代码中需要的图标, 在低版本 ...

  6. u-modal不能控制显示隐藏 icon图标不显示引入问题

    Modal 对话框 使用了 v-model 控制对话框显示,但是在真实使用的使用,发现这个 值 改变了 true 之后,对话框仍然不显示 <u-modal v-model="showM ...

  7. vue 打包部署子目录后 elementUI icon 图标不显示

    问题 部署后element-icon 请求资源404 解决 修改 vue.config.js (添加前缀路径) vue.config.js完整代码 'use strict' const path = ...

  8. iview的icon图标不显示问题

    记:2021年9月3日,寻问度娘iview官网,在导入相关icon图标发现并没有生效.查看main.js才知之前引入的是"view-design"而不是如今官网的'iview'. ...

  9. 笔记本状态栏无线图标不显示,无线网列表打不开的解决方案

    电脑环境 硬件:宏碁笔记本,Aspire E1-471G,光驱换成了ssd固态硬盘 系统:windows10企业版 LTSC 尝试时间:2020年7月25日 现象 右下角没有无线图标显示 从控制面板中 ...

最新文章

  1. 这两天老是有兄弟问到Vue的登陆和注册,登陆成功留在首页,没有登录回到登录页面,现在我用最简单实用的方法实现(两分钟技就看懂)...
  2. python批量新建文件夹_python根据txt文本批量创建文件夹
  3. php写简单接口_使用PHP如何编写简单的App接口
  4. 12个月大厂主机免费领AWS Azure Google-Cloud还不快到碗里来
  5. Java生成随机数的几种高级用法
  6. 北京IT白领的真实生活!
  7. Go的内存管理(最新学习)
  8. jQuery学习之六---属性
  9. Python(6)-文件和异常
  10. MTK DRM常见问题介绍
  11. 1682. [HAOI2014]贴海报
  12. Win11系统如何打开地雷游戏 Win11打开扫雷游戏的教程
  13. linux换硬盘网卡不能启动,服务器硬盘冷迁移后网卡无法启动问题
  14. 获得微软最有影响力开发者
  15. 【LeetCode】【数组】题号:59,螺旋数组2
  16. 【游戏开发解答】Unity发布微信小游戏,中文字无法显示的问题(自制字体库 | Font | Custom set | 动态字体 | 静态字体)
  17. 魔方cfop公式软件_【番外篇】八大魔方快速还原法图解介绍汇总大全!
  18. 深踩 AndroidStudio 缓存的坑
  19. c++ IO流---输入输出流 格式控制字符
  20. java ps old gen perm gen_java – JVM YoungGen 0%,Perm Gen 99%,OldGen Full

热门文章

  1. 百折不回结局凄惨的金庸反角
  2. 在python集成开发环境中、可使用快捷键运行程序_在Python集成开发环境中,可使用快捷键...
  3. SuperPoint学习训练纪录 盘点各种报错解决方法(二)
  4. Email的HTML代码模板
  5. 从此之后,Creator 再无秘密
  6. 做一做百度的一套C++面试题
  7. python确定指标权重_spss中如何用因子分析计算各指标的权重?
  8. Google/Baidu的搜索技巧
  9. RabbitMQ的Exchange 模式之topic(主题模式)
  10. 计算机文档xsl,XSL 文件扩展名: 它是什么以及如何打开它?