在SystemUi中的PhoneStatusBar中的makeStatusBarView()方法中有如下代码
可见framework/base/core/res/config 中的config_showNavigationBar属性可以决定是否显示虚拟按键,而全局属性qemu.hw.mainkeys可以覆盖此结果。
try {
boolean showNav = mWindowManagerService.hasNavigationBar();
if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav);
if (showNav && !mRecreating) {
mNavigationBarView =
(NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);
mNavigationBarView.setDisabledFlags(mDisabled);
mNavigationBarView.setBar(this);
mNavigationBarView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
checkUserAutohide(v, event);
return false;
}});
}
} catch (RemoteException ex) {
// no window manager? good luck with that
}
此方法决定是否显示虚拟按键,mWindowManagerService 为PhoneWindowManager实例。
在PhoneWindowManager中有如下
mHasNavigationBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
// Allow a system property to override this. Used by the emulator.
// See also hasNavigationBar().
String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
mHasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
mHasNavigationBar = true;
}
// Use this instead of checking config_showNavigationBar so that it can be consistently
// overridden by qemu.hw.mainkeys in the emulator.
@Override
public boolean hasNavigationBar() {
return mHasNavigationBar;
}
可见framework/base/core/res/config 中的config_showNavigationBar属性可以决定是否显示虚拟按键,而全局属性qemu.hw.mainkeys可以覆盖此结果。