前言
由于公司应用不知道如何隐藏状态栏和导航栏,要求系统提供接口实现该功能,没有办法,搞系统开发的苦逼青年们就得满足各种要求,即使知道不合理!下面是具体实现,应用只要发送相应的广播即可达到动态显示和隐藏的目的。
实现
zhoujy@TP:~/data/android/sc826_cn_01_00/msm_8953_git$ git diff
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index c3d8340..d429083 100755
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -435,6 +435,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private int mNavigationIconHints = 0;
private HandlerThread mHandlerThread;
+ private static final String SHOW_NAVIGATION = "car.intent.systemui.shownavigation";
+ private static final String HIDE_NAVIGATION = "car.intent.systemui.hidenavigation";
+ private static final String SHOW_STATUSBAR = "car.intent.systemui.showstatusbar";
+ private static final String HIDE_STATUSBAR = "car.intent.systemui.hidestatusbar";
// ensure quick settings is disabled until the current user makes it through the setup wizard
private boolean mUserSetup = false;
@@ -1062,7 +1066,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
demoFilter.addAction(ACTION_DEMO);
context.registerReceiverAsUser(mDemoReceiver, UserHandle.ALL, demoFilter,
android.Manifest.permission.DUMP, null);
-
+ IntentFilter carfilter = new IntentFilter();
+ carfilter.addAction(SHOW_NAVIGATION);
+ carfilter.addAction(HIDE_NAVIGATION);
+ carfilter.addAction(SHOW_STATUSBAR);
+ carfilter.addAction(HIDE_STATUSBAR);
+ context.registerReceiverAsUser(carBroadcastReceiver, UserHandle.ALL, carfilter, null, null);
// listen for USER_SETUP_COMPLETE setting (per-user)
resetUserSetupObserver();
@@ -3660,6 +3669,30 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}, cancelAction, afterKeyguardGone);
}
+ private BroadcastReceiver carBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.e(TAG, "zjy--onReceive: " + intent);
+ String action = intent.getAction();
+ if (HIDE_NAVIGATION.equals(action)) {
+ if (mNavigationBarView == null) return;
+
+ mWindowManager.removeViewImmediate(mNavigationBarView);
+ mNavigationBarView = null;
+ }else if (SHOW_NAVIGATION.equals(action)) {
+ if (mNavigationBarView != null) return;
+ createNavigationBarView(context);
+ addNavigationBar();
+ }else if(HIDE_STATUSBAR.equals(action)) {
+ //mStatusBarView.setVisibility(View.GONE);
+ mStatusBarWindow.setVisibility(View.GONE);
+ }else if(SHOW_STATUSBAR.equals(action)) {
+ //mStatusBarView.setVisibility(View.VISIBLE);
+ mStatusBarWindow.setVisibility(View.VISIBLE);
+
+ }
+ }
+ };
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -4062,6 +4095,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
mContext.unregisterReceiver(mBroadcastReceiver);
mContext.unregisterReceiver(mDemoReceiver);
+ mContext.unregisterReceiver(carBroadcastReceiver);
mAssistManager.destroy();
final SignalClusterView signalCluster =
用法
在Activity的onResume()方法中隐藏状态栏和导航栏,在onStop()方法中显示状态栏和导航栏。
@Override
protected void onResume() {
super.onResume();
Intent i = new Intent("car.intent.systemui.hidenavigation");
sendBroadcast(i);
Intent status = new Intent("car.intent.systemui.hidestatusbar");
sendBroadcast(status);
Log.d(TAG,"onResume");
}
@Override
protected void onStop() {
super.onStop();
Intent i = new Intent("car.intent.systemui.shownavigation");
sendBroadcast(i);
Intent status = new Intent("car.intent.systemui.showstatusbar");
sendBroadcast(status);
Log.d(TAG,"onStop");
}
后记
其实应用也是可以隐藏状态栏和导航栏的,由于很多做应用的同仁们不愿意查,公司有系统开发就要求系统工程师满足他们一切功能,这样达不到学习的目的,技术也难以提高,具体实现是在Activity的onCreate方法中添加如下方法即可:
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_IMMERSIVE;
window.setAttributes(params);