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

我们可能经常需要根据一些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.java
index 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/android
index 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/an
index 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;

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值