最近公司的一款工控板客户提出了一个这样的问题,在进入他的应用是用户不允许退出,要显示全屏。为了实现客户的这个要求,特意网上搜索了一下,结合几个人的文章,实现了这个功能。(通过广播的方式,实现进入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);
}
好了,暂时就这么多了,再多也没用了。