需求如題。
在Android4.2.2中,導航欄(也就是屏幕底部的三個按鈕,home,back,recentapp)是系統應用SystemUi.apk的一部分,簡言之,我們的需求就是讓我們的app來控制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()(原有):
- private void addNavigationBar() {
- if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
- if (mNavigationBarView == null) return;
-
- prepareNavigationBarView();
-
- mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
- }
<2>隱藏方法定義如下(新加):
- private void removeNavigationBar() {
- if (mNavigationBarView == null) return;
- mWindowManager.removeView(mNavigationBarView);
-
- sp;}
<3>廣播的注冊
- IntentFilter filter1 = new IntentFilter();
- filter1.addAction("MyRecv_action");
- context.registerReceiver(mBroadcastReceiver1, filter1);
<4>廣播監聽及處理
- private BroadcastReceiver mBroadcastReceiver1 = 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 后重啟即可。
在我們的app里面,如果想要隱藏導航欄:
- Intent intent=new Intent();
- intent.setAction("MyRecv_action");
- intent.putExtra("cmd","hide");
- this.sendOrderedBroadcast(intent,null);
如果想要顯示導航欄:
- Intent intent=new Intent();
- intent.setAction("MyRecv_action");
- intent.putExtra("cmd","show");
- this.sendOrderedBroadcast(intent,null);