Android4.4通过修改源码实现动态显示隐藏导航栏和状态栏

最近公司的一款工控板客户提出了一个这样的问题,在进入他的应用是用户不允许退出,要显示全屏。为了实现客户的这个要求,特意网上搜索了一下,结合几个人的文章,实现了这个功能。(通过广播的方式,实现进入app时导航栏和状态栏一次,退出app时显示)
注意,网上大部分人所说的在app里面设置flag是有问题的,在切换页面或者是弹出dialog时,导航栏和状态栏是会闪一下的,从屏幕下面或者上面往里划也会显示出来。不多说,直接写一下修改哪些地方。
1.修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
(1).新增removeNavigationBar方法,尽量放在addNavigationBar方法下面,主要是方便看。

	private void removeNavigationBar() {  
     	if (mNavigationBarView == null) return;   
		mWindowManager.removeView(mNavigationBarView); 
	} 

(2).新增BroadcastReceiver,用来接收app发来的show或者hide的广播。

	boolean isDisplayNavBar = true;
	private BroadcastReceiver mViewBroadcastReceiver = new BroadcastReceiver() {  
  
		@Override  
		public void onReceive(Context context, Intent intent) {  
		    String action = intent.getAction();  
		    if (isOrderedBroadcast()) {  
		        if (action.equals("gk_navigationbar_action")) {  
		            String cmd = intent.getStringExtra("cmd");  
		                //布尔标志isDisplayNavBar保存当前导航栏的状态  
		            if(cmd.equals("hide")&&isDisplayNavBar){  
		            	isDisplayNavBar=false;  
		                removeNavigationBar();  
						if(mStatusBarWindow != null) {
							mStatusBarWindow.setVisibility(View.GONE);
						}
		            }else if(cmd.equals("show")&&!isDisplayNavBar){  
						isDisplayNavBar=true; 
		                addNavigationBar();  
						if(mStatusBarWindow != null) {
							mStatusBarWindow.setVisibility(View.VISIBLE);
						}
		            	 
		            } 
		        }
		    }  
		    this.abortBroadcast();  
		}
	};  

(3).在PhoneStatusBar.java的start方法里面注册广播。

@Override
    public void start() {
        mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
                .getDefaultDisplay();
        updateDisplaySize();

        super.start(); // calls createAndAddWindows()

        addNavigationBar();

        // Lastly, call to the icon policy to install/update all the icons.
        mIconPolicy = new PhoneStatusBarPolicy(mContext);

        mHeadsUpObserver.onChange(true); // set up
        if (ENABLE_HEADS_UP) {
            mContext.getContentResolver().registerContentObserver(
                    Settings.Global.getUriFor(SETTING_HEADS_UP), true,
                    mHeadsUpObserver);
        }
		//new add
		registerNavigationBarReceiver();
    }
    /*
    *新加方法
    */
	public void registerNavigationBarReceiver(){
		Log.v(TAG, "registerNavigationBarReceiver");
		IntentFilter naviFilter = new IntentFilter();  
		naviFilter.addAction("gk_navigationbar_action");  
		mContext.registerReceiver(mViewBroadcastReceiver, naviFilter);  
	}

(4).app发送广播实现隐藏和显示。

public  static void hideNavigationbar(Context context){
        Intent intent=new Intent();
        intent.setAction("gk_navigationbar_action");
        intent.putExtra("cmd","hide");
        context.sendOrderedBroadcast(intent,null);
    }

    public static void showNavigationbar(Context context){
        Intent intent=new Intent();
        intent.setAction("gk_navigationbar_action");
        intent.putExtra("cmd","show");
        context.sendOrderedBroadcast(intent,null);
    }

好了,暂时就这么多了,再多也没用了。

你可能感兴趣的:(android)