Navigation Bar 修改问题(三) ----- 系统重启Launcher界面显示Nv Bar

转载地址:http://blog.csdn.net/chenqian_lj/article/details/17956407

在实际的应用中,发现没有Navigation Bar的横屏Launcher在重新启动后的第一次显示,会把NavigationBar显示出来,

具体的Navigation Bar的改动可以参照上面的相关的两篇文章:

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

的错误

你可能感兴趣的:(Android源码修改)