Android客制化------动态控制导航栏与状态栏

来源:互联网 发布:光纤交换机端口 编辑:程序博客网 时间:2024/05/22 05:07

我们可能经常需要根据一些apk(没有源码,只有单纯的一个app)的打开与关闭去动态的显示状态栏与导航栏。甚至去控制状态栏的下拉事件。
需要去实现一点我们首先得了解Android中Activity的生命周期,下面请出谷爹的周期图。
这里写图片描述
onResume() 此状态下,activity处在前台,用户可以与它进行交互。
这里就是我们需要去动手脚的地方了,我们通过在Android源码中的Activity.java这个类的onResume()方法去加以甄别进而判断是否显示导航栏以及状态栏。因为所有的Activity都会继承自Activity.java。

diff --git a/frameworks/base/core/java/android/app/Activity.java b/frameworks/base/core/java/android/app/Activity.javaindex d6db8c2..d70cf9c 100644--- a/frameworks/base/core/java/android/app/Activity.java+++ b/frameworks/base/core/java/android/app/Activity.java@@ -1092,10 +1092,28 @@ public class Activity extends ContextThemeWrapper      * @see #onPostResume      * @see #onPause      */+        private String kidzone;     protected void onResume() {         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);         getApplication().dispatchActivityResumed(this);         mCalled = true;+                           +               kidzone = getPackageName();+              if(kidzone.equals("你的apk包名") || kidzone.equals("你的apk包名")){+               //发送隐藏广播+               Intent intent = new Intent();+                intent.setAction("xxx");+                intent.putExtra("flag", true);+                this.sendBroadcast(intent);+               }else {+                //发送显示广播+                Intent intent = new Intent();+                intent.setAction("xxx");+                intent.putExtra("flag", false);+                this.sendBroadcast(intent);+               }     }     /**

同时我们去SystemUI中接收相关广播执行相关动作。

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/frameworks/base/packages/SystemUI/src/com/androidindex a7ef867..78c7ed7 100644--- 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@@ -480,7 +480,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {                                                                                                        Log.d("screenshot","disable screenshot button");                                                                                           mNavigationBarView.getScreenshotButton().setVisibility(View.GONE);                                                                                                         }-                                                                               +                                       }else if(action.equals("xxx")){+                                       boolean flag =intent.getBooleanExtra("flag", false);+                                       if(flag){+       //此处就是隐藏状态栏以及导航栏                                +  mStatusBarWindow.setVisibility(View.INVISIBLE);+  mNavigationBarView.setVisibility(View.INVISIBLE);+                                       }else{+ mStatusBarWindow.setVisibility(View.VISIBLE);+ mNavigationBarView.setVisibility(View.VISIBLE);+                                       }                                                                                                        }else{                                                                                                                            takeScreenshot();                                                                                                                        }diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/frameworks/base/packages/SystemUI/src/com/anindex 4901823..f2cb4cc 100644--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java@@ -33,6 +33,13 @@ import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.policy.NotificationRowLayout;+import android.content.BroadcastReceiver;+import android.content.Intent;+import android.content.IntentFilter;+import android.util.Log; public class StatusBarWindowView extends FrameLayout {@@ -50,6 +57,11 @@ public class StatusBarWindowView extends FrameLayout         super(context, attrs);         setMotionEventSplittingEnabled(false);         setWillNotDraw(!DEBUG);         //注册相关广播+               IntentFilter intentFilter = new IntentFilter();+               intentFilter.addAction("xxx");+               context.registerReceiver(new MyBroadcastReciver(), intentFilter);     }     @Override@@ -85,8 +97,26 @@ public class StatusBarWindowView extends FrameLayout         return super.dispatchKeyEvent(event);     }+       private boolean flag;+       private class MyBroadcastReciver extends BroadcastReceiver {+               @Override+               public void onReceive(Context context, Intent intent) {+                      String action = intent.getAction();+                       if (action.equals("xxx")) {+ //得到flag+       flag =intent.getBooleanExtra("flag", false);+                       }+               }+       }+     @Override     public boolean onInterceptTouchEvent(MotionEvent ev) {     //这个地方就是是否能够下拉状态栏啦 +       if(flag){ +                       return true;+               }else{         boolean intercept = false;         if (mNotificationPanel.isFullyExpanded() && mScrollView.getVisibility() == View.VISIBLE) {             intercept = mExpandHelper.onInterceptTouchEvent(ev);@@ -101,6 +131,7 @@ public class StatusBarWindowView extends FrameLayout             cancellation.recycle();         }         return intercept;+                          }     }     @Override

不要着急,在这里我们还要进行最后一项工作,此处虽然我们已经达到隐藏的效果了,但是我们会显示一条黑色矩形,也就是导航栏高度的占据整个屏幕的黑色矩形,我们需要去处理一下。

diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/frameworks/base/policy/src/com/android/internal/policy/impl/index 6bbd7b3..3c3bef1 100644--- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java+++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java@@ -111,6 +111,13 @@ import static android.view.WindowManager.LayoutParams.*; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;++import android.content.BroadcastReceiver;+import android.content.Intent;+import android.content.IntentFilter;+import android.util.Log; /**  * WindowManagerPolicy implementation for the Android phone UI.  This  * introduces a new method suffix, Lp, for an internal lock of the@@ -857,6 +864,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {     public void init(Context context, IWindowManager windowManager,             WindowManagerFuncs windowManagerFuncs) {         mContext = context;  +         IntentFilter intentFilter = new IntentFilter();+        intentFilter.addAction("xxx");+        context.registerReceiver(new MyBroadcastReciver(), intentFilter);         mWindowManager = windowManager;         mWindowManagerFuncs = windowManagerFuncs;         mHeadless = "1".equals(SystemProperties.get("ro.config.headless", "0"));@@ -1000,6 +1012,20 @@ public class PhoneWindowManager implements WindowManagerPolicy {                }                            }+       private boolean Hideflag;+       private class MyBroadcastReciver extends BroadcastReceiver {+               @Override+               public void onReceive(Context context, Intent intent) {+                       String action = intent.getAction();+                       if (action.equals("xxx")) {+          Hideflag =intent.getBooleanExtra("flag", false);+                       }+               }+       }++     /**      * Read values from config.xml that may be overridden depending on      * the configuration of the device.@@ -5154,6 +5180,29 @@ public class PhoneWindowManager implements WindowManagerPolicy {             return 0;         }+               Resources res = mContext.getResources();+               if(Hideflag){+ //去除黑色矩形+                       mStatusBarHeight = 0;+                       mNavigationBarHeightForRotation[mPortraitRotation] =+                       mNavigationBarHeightForRotation[mUpsideDownRotation] =0;+                      mNavigationBarHeightForRotation[mLandscapeRotation] =+                       mNavigationBarHeightForRotation[mSeascapeRotation] = 0;+               }else{+               +               mStatusBarHeight =+               res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);+                       mNavigationBarHeightForRotation[mPortraitRotation] =+                       mNavigationBarHeightForRotation[mUpsideDownRotation] =+                       res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_height);+                       mNavigationBarHeightForRotation[mLandscapeRotation] =+                       mNavigationBarHeightForRotation[mSeascapeRotation] = res.getDimensionPixelSize(+                       com.android.internal.R.dimen.navigation_bar_height_landscape);+                       +               }         int tmpVisibility = win.getSystemUiVisibility()                 & ~mResettingSystemUiFlags                 & ~mForceClearedSystemUiFlags;

至此我们就大功告成啦。
如有不对的地方,欢迎留言指出,谢谢。

原创粉丝点击