转载地址:http://blog.csdn.net/chenqian_lj/article/details/17956407
在实际的应用中,发现没有Navigation Bar的横屏Launcher在重新启动后的第一次显示,会把NavigationBar显示出来,
具体的Navigation Bar的改动可以参照上面的相关的两篇文章:
Navigation Bar 修改问题(二)------ Launcher与应用之间切换
这里解释一下为什么会出现此现象
问题发生的原因其实和PhoneWindowManager(PWM)中的mStatusBarService的值有关,在某些时候,mStatusBarService 可能为null,
StatusBarManagerService 依赖WMS(参见SystemServer.java), WMS中才能调用PWM,而hideNavigation Bar又是从PWM中调入,必然在中间PWM中mStatusBarSerivice有时刻为空,导致会先显示navigation bar然后再消失
解决方案:
1) 取消默认的navigation bar显示 【在config.xml 中取消】
2) PWM中判断mStatusBarService是否为空的逻辑
public void showNavigationBar() {
Slog.d(TAG, " PWM showNavigationBar xxxx hasNavigationBar = " + hasNavigationBar());
if (!hasNavigationBar()) {
//TODO: need open it
if (mStatusBarService != null) {
mHasNavigationBar = true; // wait for mStatusBarService prepared
try {
Slog.d(TAG, " PWM showNavigationBar mStatusBarService xxxx");
mStatusBarService.showNavigationBar();
} catch (RemoteException e) {
// oh well
}
}
}
}
3) 在第一次启动的时候在PhoneStatusBar中添加Navigation bar的调用逻辑
public void showNavigationBar() {
Xlog.d(TAG, " showNavigationBar ");
if (mFirstBoot) {
if (mNavigationBarView == null) {
try {
boolean showNav = mWindowManagerService.hasNavigationBar();
if (DEBUG) Slog.v(TAG, "hasNavigationBar=" + showNav);
if (showNav) {
mNavigationBarView =
(NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
mNavigationBarView.setDisabledFlags(mDisabled);
mNavigationBarView.setBar(this);
}
} catch (RemoteException ex) {
// no window manager? good luck with that
Xlog.e(TAG, " RemoteException error happened, [can't find WindowManager]");
return;
}
}
addNavigationBar();
mFirstBoot = false;
return;
}
if (mNavigationBarView == null) {
try {
boolean showNav = mWindowManagerService.hasNavigationBar();
if (DEBUG) Slog.v(TAG, "hasNavigationBar=" + showNav);
if (showNav) {
mNavigationBarView =
(NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
mNavigationBarView.setDisabledFlags(mDisabled);
mNavigationBarView.setBar(this);
}
mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
} catch (RemoteException ex) {
// no window manager? good luck with that
}
}
}
实际中,这样的修改还是有问题的,由于mNavigationBarView不断的释放和创建,会发生某些类似:
01-06 18:04:59.024 14261 14261 E AndroidRuntime: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@425d2d50 -- another window of this type already exists
的错误