导航栏(也就是屏幕底部的三个按钮,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"); 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);
|