实际上SystemUI在Android系统中充当了重要角色,比如我们可见的状态栏、通知栏、下拉菜单、导航栏、长按关机页、锁屏界面、低电提示等都隶属于SystemUI。
网上现已有很多关于SystemUI的启动流程了,在这里我就不做赘述了,直接上代码
- 隐藏/显示状态栏
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);
+ }
- 隐藏/显示导航栏
导航栏的隐藏和状态栏不一样,不是简单的调用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();
+ }
+ }
到这里已经基本完成了状态栏及导航栏的显示/隐藏设置,此贴只为了做个记录,如有错误欢迎大家指正,希望能与大家进行探讨。