100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > android10动态显示隐藏导航栏 状态栏

android10动态显示隐藏导航栏 状态栏

时间:2020-07-13 09:05:19

相关推荐

android10动态显示隐藏导航栏 状态栏

实现方式:在frameworks里增加一个自定义 的service,接收上层应用广播,然后通过这个service来发送控制显示隐藏的功能,也可以上层应用发送广播直接控制显示隐藏,因为还有其它功能,所以单独加了一个service

修改:frameworks/base/core/res/AndroidManifest.xml

@@ -634,6 +634,12 @@<!-- For tether entitlement recheck--><protected-broadcastandroid:name="com.android.server.connectivity.tethering.PROVISIONING_RECHECK_ALARM" />++<!--add by hclydao for broadcast -->+<protected-broadcast android:name="com.gzease.action.hide_nav_bar" />+<protected-broadcast android:name="com.gzease.action.show_nav_bar" />+<protected-broadcast android:name="com.gzease.action.hide_status_bar" />+<protected-broadcast android:name="com.gzease.action.show_status_bar" /><!-- ====================================================================== --><!--RUNTIME PERMISSIONS --><!-- ====================================================================== -->

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

--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java@@ -316,7 +316,14 @@ public class StatusBar extends SystemUI implements DemoMode,/** If true, the lockscreen will show a distinct wallpaper */public static final boolean ENABLE_LOCKSCREEN_WALLPAPER = true;-+//add by hclydao+private final String ACTION_HIDE_NAV_BAR = "com.gzease.action.hide_nav_bar";+private final String ACTION_SHOW_NAV_BAR = "com.gzease.action.show_nav_bar";+private final String ACTION_HIDE_STATUS_BAR = "com.gzease.action.hide_status_bar";+private final String ACTION_SHOW_STATUS_BAR = "com.gzease.action.show_status_bar";++private boolean isHideNavBar = false;+private boolean isHideStatusBar = false;static {boolean onlyCoreApps;try {@@ -1011,6 +1018,11 @@ public class StatusBar extends SystemUI implements DemoMode,IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);filter.addAction(Intent.ACTION_SCREEN_OFF);+//add by hclydao+filter.addAction(ACTION_HIDE_NAV_BAR);+filter.addAction(ACTION_SHOW_NAV_BAR);+filter.addAction(ACTION_HIDE_STATUS_BAR);+filter.addAction(ACTION_SHOW_STATUS_BAR);filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);@@ -2535,7 +2547,7 @@ public class StatusBar extends SystemUI implements DemoMode,return deferred;}, cancelAction, afterKeyguardGone);}-+private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {@@ -2570,7 +2582,34 @@ public class StatusBar extends SystemUI implements DemoMode,}else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {mQSPanel.showDeviceMonitoringDialog();- }+ } else if(action.equals(ACTION_HIDE_NAV_BAR)) {//add by hclydao+Log.d(TAG, "ACTION_HIDE_NAV_BAR isHideNavBar: " + isHideNavBar);+if(!isHideNavBar) {+isHideNavBar = true;+mNavigationBarController.onDisplayRemoved(mDisplayId);+}+} else if(action.equals(ACTION_SHOW_NAV_BAR)) {+Log.d(TAG, "ACTION_SHOW_NAV_BAR isHideNavBar: " + isHideNavBar);+if(isHideNavBar) {+isHideNavBar = false;+mNavigationBarController.onDisplayReady(mDisplayId);+}+} else if(action.equals(ACTION_HIDE_STATUS_BAR)) {+Log.d(TAG, "ACTION_HIDE_STATUS_BAR isHideStatusBar: " + isHideStatusBar);+if(!isHideStatusBar) {+isHideStatusBar = true;+//mStatusBarView.setVisibility(View.GONE);//如果同时要隐藏导航栏和状态栏可以只使用这一个,不会出现bug+mStatusBarWindowController.setBarHeight(0);//一定要加这个,不然removeViewImmediate后更新mStatusBarWindowController会出现bug+mWindowManager.removeViewImmediate(mStatusBarWindow);+}+} else if(action.equals(ACTION_SHOW_STATUS_BAR)) {+Log.d(TAG, "ACTION_SHOW_STATUS_BAR isHideStatusBar: " + isHideStatusBar);+if(isHideStatusBar) {+isHideStatusBar = false;+mStatusBarWindowController.add(mStatusBarWindow, getStatusBarHeight());+//mStatusBarView.setVisibility(View.VISIBLE);//如果同时要隐藏导航栏和状态栏可以只使用这一个,不会出现bug+}+} //add end}};@@ -3666,17 +3705,23 @@ public class StatusBar extends SystemUI implements DemoMode,final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {@Overridepublic void onScreenTurningOn() {+if(isHideStatusBar) //add by hclydao 使用setVisibility隐藏时不用加+return;mFalsingManager.onScreenTurningOn();mNotificationPanel.onScreenTurningOn();}@Overridepublic void onScreenTurnedOn() {+if(isHideStatusBar) //add by hclydao 使用setVisibility隐藏时不用加+return;mScrimController.onScreenTurnedOn();}@Overridepublic void onScreenTurnedOff() {+if(isHideStatusBar) //add by hclydao 使用setVisibility隐藏时不用加+return;mFalsingManager.onScreenOff();mScrimController.onScreenTurnedOff();updateIsKeyguard();

状态栏显示隐藏说明

如果只使用mStatusBarView.setVisibility(View.GONE);进行隐藏,使用mStatusBarView.setVisibility(View.VISIBLE);进行显示,隐藏时状态栏里的内容是全部进行了隐藏,但状态栏的那个高度还在,还在那占地方,上层应用需要设置为全屏显示才能完全隐藏掉状态栏的位置,即要在上层应用中加上

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN);

这种修改不会出现systemui异常的风险。

但是有的客户要求显示导航栏,但隐藏状态栏,此时就不能使用这种方式了,隐藏时需要彻底去掉状态栏,使用这种方式时还需要修改几个地方,不然systemui会出现异常。

使用完全隐藏方式时还需要修改

修改:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java

@@ -328,6 +328,12 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,}private void updateRegionForNotch(Region region) {+//add by hclydao+if(mStatusBarWindowView == null)+return;+if(mStatusBarWindowView.getRootWindowInsets() == null)+return;+//add endDisplayCutout cutout = mStatusBarWindowView.getRootWindowInsets().getDisplayCutout();if (cutout == null) {return;

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

@@ -322,7 +322,8 @@ public class StatusBarWindowController implements Callback, Dumpable, ConfiguratapplyNotTouchable(state);applyStatusBarColorSpaceAgnosticFlag(state);if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {- mWindowManager.updateViewLayout(mStatusBarView, mLp);+if(mBarHeight != 0) //add by hclydao+ mWindowManager.updateViewLayout(mStatusBarView, mLp);}if (mHasTopUi != mHasTopUiChanged) {try {

关闭应用全屏时的提示

修改frameworks/base/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java

@@ -54,7 +54,7 @@ import android.widget.Button;import android.widget.FrameLayout;import com.android.internal.R;-+import android.os.SystemProperties; //add by hclydao/*** Helper to manage showing/hiding a confirmation prompt when the navigation bar is hidden* entering immersive mode.@@ -326,6 +326,9 @@ public class ImmersiveModeConfirmation {mContext.registerReceiver(mReceiver,new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));+if(!SystemProperties.getBoolean("gzease.fullnotify",false)) { //add by hclydao+mConfirm.run();//add by hclydao no fullscreen notify+}}@Override

目前测试动态显示隐藏,暂时没有发现什么问题

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。