导航栏(也就是屏幕底部的三个按钮,home,back,recentapp)是系统应用SystemUi.apk的一部分.我们可以在SystemUi.apk的源码中留下接口便于我们控制导航栏的显示和隐藏,我们可以通过广播的接收与发送的方式来实现这个接口。

app------->发送广播(hide/show)

SystemUi.apk-------->监听广播 (hide-隐藏导航栏,show-显示导航栏)

SystemUi.apk是系统应用,它在Android文件系统中的路径是:/system/app/;它在Android源码中的路径是:frameworks/base/packages/SystemUI/;

我们只需修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

<1>显示方法使用addNavigationBar()(原有):

1
2
3
4
5
6
7
8
private void addNavigationBar() {  
if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
if (mNavigationBarView == null) return;

prepareNavigationBarView();

mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
}

<2>隐藏方法定义如下(新加):

1
2
3
4
5
private void removeNavigationBar(){
if(DEBUG) Log.v(TAG,"removeNavigationBar: about to remove "+ mNavigationBarView);
if(mNavigationBarView == null) return;
mWindowManager.removeView(mNavigationBarView);
}

<3>广播的注册

1
2
3
IntentFilter filter1 = new IntentFilter();  
filter1.addAction("MyRecv_action");
context.registerReceiver(mBroadcastReceiver1, filter1);

<4>广播监听及处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private boolean isDisplayNavBar;
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (isOrderedBroadcast()){
if(action.equals("MyRecv_action")){
String cmd = intent.getStringExtra("cmd");
//布尔标志isDisplayNavBar保存当前导航栏的状态
if(cmd.equals("hide")&&isDisplayNavBar){
isDisplayNavBar=false;
removeNavigationBar();
}else if(cmd.equals("show")&&!isDisplayNavBar){
addNavigationBar();
isDisplayNavBar=true;
}
}
this.abortBroadcast();
}
}
};

至此修改完毕,编译完毕之后产生新的SystemUi.apk ,替换原文件系统的SystemUi.apk 后重启即可。

隐藏导航栏:

1
2
3
4
Intent intent=new Intent();  
intent.setAction("MyRecv_action");
intent.putExtra("cmd","hide");
this.sendOrderedBroadcast(intent,null);

显示导航栏:

1
2
3
4
Intent intent=new Intent();  
intent.setAction("MyRecv_action");
intent.putExtra("cmd","show");
this.sendOrderedBroadcast(intent,null);