我们可能经常需要根据一些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;
至此我们就大功告成啦。
如有不对的地方,欢迎留言指出,谢谢。