首页 > 其他分享 >【SystemUI】动态显示或隐藏状态栏及导航栏

【SystemUI】动态显示或隐藏状态栏及导航栏

时间:2023-09-18 17:35:22浏览次数:40  
标签:动态显示 HIDE 状态栏 SHOW SystemProperties intent dy NAVIGATION SystemUI

【SystemUI】动态显示或隐藏状态栏及导航栏


平台:RK_TAOBAO_356X    Android11

需求描述:动态切换状态栏与导航栏的显示或隐藏

【解决方案】

通过收发广播进行切换;

> 备注: protected-broadcast  为保护广播,如第三方应用想要接收到系统发送到以下广播,系统需对第三方应用开启相关se权限(以下未涉及,根据不同设备自行抓取)

frameworks\base\packages\SystemUI\AndroidManifest.xml中新增如下,

+ <protected-broadcast android:name="com.dy.intent.systemui.STATUS_BAR_SHOW" ></protected-broadcast>
+ <protected-broadcast android:name="com.dy.intent.systemui.STATUS_BAR_HIDE" ></protected-broadcast>
+ <protected-broadcast android:name="com.dy.intent.systemui.NAVIGATION_BAR_SHOW" ></protected-broadcast>
+ <protected-broadcast android:name="com.dy.intent.systemui.NAVIGATION_BAR_HIDE" ></protected-broadcast>

SystemUI\src\com\android\systemui\statusbar\NavigationBarController.java中新增如下,

+ public void removeNavigationBarView(){
+     removeNavigationBar(mDisplayId);
+ }

SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarView.java中修改如下:

+ import android.os.SystemProperties;
@Override
public boolean onTouchEvent(MotionEvent event) {
    ......
-   //return barConsumedEvent || super.onTouchEvent(event);
+   boolean enable = SystemProperties.get("persist.dy.statubar","1").equals("1");
+   return enable ? barConsumedEvent || super.onTouchEvent(event) : enable;
}

SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java

+ import android.os.SystemProperties;

+ public static final String STATUSBAR_SHOW = "com.dy.intent.systemui.STATUS_BAR_SHOW";
+ public static final String STATUSBAR_HIDE = "com.dy.intent.systemui.STATUS_BAR_HIDE";
+ public static final String NAVIGATION_SHOW = "com.dy.intent.systemui.NAVIGATION_BAR_SHOW";  
+ public static final String NAVIGATION_HIDE = "com.dy.intent.systemui.NAVIGATION_BAR_HIDE";
+ private RegisterStatusBarResult controlResult;

protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
    ......
    mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
    mNotificationLogger.setHeadsUpManager(mHeadsUpManager);        
+   controlResult = result;
+   try {
+       boolean showNav = SystemProperties.get("persist.dy.statubar.naviga","1").equals("1");
+       if (showNav) {
+           createNavigationBar(result);
+       }
+   } catch (Exception ex) {
+       if (DEBUG) Log.e(TAG, "Exception: " + ex);
+   }
    ......  
}

@VisibleForTesting
protected void registerBroadcastReceiver() {
    ......
+   filter.addAction(STATUSBAR_SHOW);
+   filter.addAction(STATUSBAR_HIDE);
+   filter.addAction(NAVIGATION_SHOW);
+   filter.addAction(NAVIGATION_HIDE);  
    mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
}

private void inflateStatusBarWindow() {
    ......
+   boolean enable = SystemProperties.get("persist.dy.statubar","1").equals("1");
+   mPhoneStatusBarWindow.setVisibility(enable ? View.VISIBLE : View.GONE);
}

private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
+       else if (STATUSBAR_SHOW.equals(action)) {
+           SystemProperties.set("persist.dy.statubar", "1");          
+           if(mPhoneStatusBarWindow != null){
+               mPhoneStatusBarWindow.setVisibility(View.VISIBLE);
+           }
+       } else if (STATUSBAR_HIDE.equals(action)) {
+           SystemProperties.set("persist.dy.statubar", "0");
+           if(mPhoneStatusBarWindow != null){
+               mPhoneStatusBarWindow.setVisibility(View.GONE);
+           }
+       } else if (NAVIGATION_SHOW.equals(action)) {
+           SystemProperties.set("persist.dy.statubar.naviga", "1");
+           if(controlResult != null && getNavigationBarView() == null){
+               try {
+                   createNavigationBar(controlResult);
+               } catch (Exception ex) {
+                   Log.e(TAG, "NAVIGATION_SHOW:exception = " + ex);
+               }
+           }                    
+       } else if (NAVIGATION_HIDE.equals(action)) {
+           SystemProperties.set("persist.dy.statubar.naviga", "0");
+           if(getNavigationBarView() != null){
+               mNavigationBarController.removeNavigationBarView();
+           }                
+       }
    }

拓展:

如上方式处理的广播,如果需要提供广播接口给三方apk,有两种方案:

1、三方apk具有系统签名,可直接按常规发送;

2、三方apk无系统签名,则需要将如上新增的广播处理放到新增静态注册的广播中处理,然后通过如下方式提供给客户:

private void sendBroadcastToSystem(String action){
    Intent intent = new Intent(action);
    intent.setComponent(new ComponentName(pkgname, clsname));
    sendBroadcast(intent);
}

标签:动态显示,HIDE,状态栏,SHOW,SystemProperties,intent,dy,NAVIGATION,SystemUI
From: https://www.cnblogs.com/a-n-yan/p/17712517.html

相关文章

  • Flutter的SystemUiOverlayStyle类详解
    SystemUiOverlayStyle介绍Flutter中的SystemUiOverlayStyle是一个类,用于控制应用程序的系统UI(用户界面)覆盖样式。它提供了一种定制应用程序状态栏和导航栏外观的方法。SystemUiOverlayStyle的属性详解SystemUiOverlayStyle类有以下属性可以设置:statusBarColor:状态栏的背景颜色......
  • MASM32编程状态栏显示字符动画,按钮跑马灯
    一、需求分析由于sysInfo扫描的内容比较多,打算为它增加一点动画效果,提醒用户程序正在运行,耐心等待。二、构建测试窗口测试窗口上放置有一个按钮,按钮上的初始文字是“开始扫描”;并使用状态栏,状态栏初始状态不显示文字。;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<......
  • 状态栏消息处理
    代码实现: classSapMessageType(enum.Enum):SUCCESS="S"WARNING="W"ERROR="E"ABORT="A"INFORMATION="I"classSapStatusMessage:def__init__(self,message_as_popup,messag......
  • Ubuntu22隐藏上方的状态栏(hide top bar):安装hide top bar这个GNOME插件
    参考链接:https://techithings.hashnode.dev/ubuntu-how-to-hide-top-bar-and-side-bar具体步骤1.安装extensionmanger这个软件sudoapt-getupdatesudoapt-getinstallgnome-shell-extension-manager-y2.打开软件extension-manager3.点击browse,搜索hidetopbar这个插......
  • 【HarmonyOS】API9沉浸式状态栏
    对于沉浸式状态栏,在之前API8FA模型开发中可以通过在config.json配置主题的方式实现应用的沉浸式体验,在最新的API9Stage模型中系统提供了沉浸式窗口的示例(管理应用窗口(Stage模型)-窗口管理-开发-HarmonyOS应用开发)。通过调用setWindowSystemBarEnable接口,设置导航栏、状态栏不显示,......
  • 直播app开发,页面顶部图片延伸到状态栏
    直播app开发,页面顶部图片延伸到状态栏 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){     //5.0全透明实现  //getWindow.setStatusBarColor(Color.TRANSPARENT)  Windowwindow=getWindow();  window.clearFlags(WindowManager.Layou......
  • Android App 隐藏标题栏+状态栏+导航栏
    1.隐藏当前Activity标题栏在当前Activity中调用:this.requestWindowFeature(Window.FEATURE_NO_TITLE);2.隐藏当前Activity状态栏(StatusBar)2.1Android4.0andLowerpublicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(Bundle......
  • Android实现沉浸式状态栏功能
    Android中实现沉浸式状态栏的功能,供大家参考,具体内容如下1.先上效果图,实现沉浸式状态栏有两种方式,一种是通过写Theme主题的方式,另一种是写代码的方式。若要使多个页面出现沉浸式状态栏,则使用主题的方式更方便,如果只要使单个页面出现,则使用代码方式更好!当然了,看个人喜好而去。......
  • android全屏显示隐藏状态栏
    Android全屏显示隐藏状态栏实现步骤实现Android全屏显示和隐藏状态栏,可以提供更好的用户体验和界面展示。下面是实现这一功能的步骤:步骤操作步骤一设置Activity的主题为全屏主题步骤二隐藏状态栏步骤三显示状态栏步骤四切换状态栏的可见性下面将详细介......
  • FPGA数码管动态显示
    FPGA驱动6位数码管,主控芯片EP4CE6F17C8N。所使用实验板的数码管原理图如图所示,所使用的数码管3661BS是6位共阳极的数码管。使用PNP三极管驱动数码管,当三极管基极SMG_W0引脚输入低电平时,PNP三极管导通。通过控制SMG_W0~W5的电平来控制三极管的导通,从而控制位选信号。共阳极数码管,......