Android 11设置动态显示/隐藏状态栏及导航栏

实际上SystemUI在Android系统中充当了重要角色,比如我们可见的状态栏、通知栏、下拉菜单、导航栏、长按关机页、锁屏界面、低电提示等都隶属于SystemUI。
网上现已有很多关于SystemUI的启动流程了,在这里我就不做赘述了,直接上代码

  1. 隐藏/显示状态栏
    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+	private void hideStatusBar() {
+		mStatusBarWindowController.setStatusBarVisible(false);
+	}

+	private void showStatusBar() {
+		mStatusBarWindowController.setStatusBarVisible(true);
+	}

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java

+    public void setStatusBarVisible(boolean visible) {
+        mStatusBarView.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
  1. 隐藏/显示导航栏
    导航栏的隐藏和状态栏不一样,不是简单的调用NavigationBar.setVisibility就可以的,我这里调用的是remove

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

	...
	private final DisplayMetrics mDisplayMetrics;
+   private RegisterStatusBarResult mResult = null;
+   private boolean isRegisterNavigationBar = false;

	...
	try {
		result = mBarService.registerStatusBar(mCommandQueue);
+       mResult = result;
    } catch (RemoteException ex) {
        ex.rethrowFromSystemServer();
    }
    ...

+   private void hideNavigationBar() {
+ 		if(isRegisterNavigationBar) {
+ 			mNavigationBarController.removeNavigationBarView();
+ 			isRegisterNavigationBar = false;
+ 		}
+ 	}
+ 
+   private void showNavigationBar() {
+ 		if(!isRegisterNavigationBar) {
+   		createNavigationBar(mResult);
+ 			isRegisterNavigationBar = true;
+ 		}
+ 	}
+ 

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java

```java
+   private List<Integer> idList = new ArrayList<>();
	...
+   public void removeNavigationBarView() {
+		for (int id : idList) {
+			removeNavigationBar(id);
+		}
+		idList.clear();
+	}
+
	...
	navBar.restoreAppearanceAndTransientState();
	mNavigationBars.append(displayId, navBar);
+	idList.add(mDisplayId);
	...

至于何时调用,可根据需求进行判断,我这里由于是设置某些第三方应用隐藏,故而添加了当前(包名)进程判断。
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

+	//获取当前运行进程
+	private String getForegroundAppPackageName() {
+		ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ 		List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
+		if (tasks != null && !tasks.isEmpty()) {
+			return tasks.get(0).topActivity.getPackageName();
+		}
+		return null;
+	}

	...
	@Override
	public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
	AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
		...
		updateBubblesVisibility();
+		refreshStatusBarAndNavigation();
	}

	@Override
	public void setTopAppHidesStatusBar(boolean topAppHidesStatusBar) {
		...
		updateHideIconsForBouncer(true /* animate */);
+		refreshStatusBarAndNavigation();
	}
	...
+   public void refreshStatusBarAndNavigation() {
+		String foregroundApp = getForegroundAppPackageName();
+		if (foregroundApp.equals(yourname)) {  //yourname为你想隐藏的应用
+			hideStatusBar();
+			hideNavigationBar();
+		} else {
+			showStatusBar();
+			showNavigationBar();
+		}
+	}

到这里已经基本完成了状态栏及导航栏的显示/隐藏设置,此贴只为了做个记录,如有错误欢迎大家指正,希望能与大家进行探讨。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值