Android通过修改Framework隐藏系统状态栏

其实,真的需要完全隐藏系统状态栏的需求并不是很多,只有一些定制性的需求的时候才有这样的要求,这次就是这样的要求,需要完全隐藏系统状态栏,考虑修改Framework的SystemUI来实现。这些需要使用源码开发环境,我们修改以后,需要启动模拟器测试效果。

我们主要是想通过隐藏StatusBar来消除通知栏,在Android_Source
/frameworks/base/packages/SystemUI/src
下我们可以找到
com.android.systemui.statusbar包下面的BaseStatusBar.java文件,
查看源码,发现在start()方法中有调用一个抽象方法createAndAddWindows();查看这个抽象方法的实现,有
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
这是两种不同模式下的处理,这里我们测试修改PhoneStatusBar里面的代码:

@Override
public void createAndAddWindows() {
   addStatusBarWindow();
}

调用了addStatusBarWindow();方法,在这个方法中:

private void addStatusBarWindow() {
  // Put up the view
  final int height = getStatusBarHeight();

  // Now that the status bar window encompasses the sliding panel and its
  // translucent backdrop, the entire thing is made TRANSLUCENT and is
  // hardware-accelerated.
  final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
  ViewGroup.LayoutParams.MATCH_PARENT,
  height,
  WindowManager.LayoutParams.TYPE_STATUS_BAR,
  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
  | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
  PixelFormat.TRANSLUCENT);

  lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;

  lp.gravity = getStatusBarGravity();
  lp.setTitle(“StatusBar”);
  lp.packageName = mContext.getPackageName();

  makeStatusBarView();
  WindowManagerImpl.getDefault().addView(mStatusBarWindow, lp);  
}

我们看到调用了makeStatusBarView();方法,在这个方法最后返回前,我们添加一行代码

mStatusBarView.setVisibility(View.GONE);

把它隐藏。然后重新编译framework,启动模拟器,可以看到系统状态栏确实看不到了,但是状态栏的位置还在,一片黑色罢了。

继续尝试修改,找到%Android_Source%/frameworks/base/core/res/res/values/dimens.xml

修改25dip0dip

再次编译framework,重启模拟器测试。

你可能感兴趣的:(Android通过修改Framework隐藏系统状态栏)