[置顶] android 4.2 隐藏/显示 navigation bar, 实现全屏显示


引子:   eoe 上有人实现了 android 4.0 下 隐藏/显示 navigation bar, 实现全屏显示的方法(http://www.eoeandroid.com/thread-246825-1-1.html?_dsign=0fde0ea0), 跟贴者很多, 也有很多人在问4.2 下如何实现, 借由作者的思路,我在android 4.2 实现隐藏/显示 navigation bar, 代码如下。


1.   /base/packages/SystemUI/src/com/android/systemui/SystemUI.java

      在SystemUI.java 中添加 onReceive() 方法.


package com.android.systemui;

import java.io.FileDescriptor;
import java.io.PrintWriter;

import android.content.Context;
import android.content.res.Configuration;

public abstract class SystemUI {
    public Context mContext;

    public abstract void start();

    public void onReceive(String action) {
    }

    
    protected void onConfigurationChanged(Configuration newConfig) {
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    }
}


2.   /frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java 的onCreate方法中去注册一个广播


      //add by huangbozhi
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ACTION_DISPLAY_STATUS_BAR);
        intentFilter.addAction(ACTION_HIDE_STATUS_BAR);
        registerReceiver(mStatusBarReceiver, intentFilter);
      //add by huangbozhi


这里有两个广播ACTION_DISPLAY_STATUS_BAR  和  ACTION_HIDE_STATUS_BAR, 目的是接收应用发出的广播, 发出隐藏广播时, 则隐藏导航栏,

发出显示广播时, 则显示导航栏, ACTION_DISPLAY_STATUS_BAR  和  ACTION_HIDE_STATUS_BAR 是自已定义的, 就在 SystemUIService.java 里

   //add by huangbozhi
    public static final String ACTION_DISPLAY_STATUS_BAR = "com.android.action.display_navigationbar";
    public static final String ACTION_HIDE_STATUS_BAR = "com.android.action.hide_navigationbar";

    //add by huangbozhi


3. 在SystemUIService.java 中接收来自应用层的广播


//add by huangbozhi
    BroadcastReceiver mStatusBarReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            
            if (intent != null && !TextUtils.isEmpty(intent.getAction())) {
                String action = intent.getAction();

                Log.d(TAG, "*** onReceive(), action = " + action + " ***");
                
                final int N = SERVICES.length;
                for (int i = 0; i < N; i++) {
                    Slog.d(TAG, "invoke: " + mServices[i] + "'s onReceive()");
                    
                    if(mServices[i] instanceof PhoneStatusBar){
                    
                    mServices[i].onReceive(action);

                    
                    }
                }
            }
        }
    };


注意红色标记部分, 因为PhoneStatusBar 继承自SystemUI.java, 所以我们在PhoneStatusBar 中去重写onReceive方法。


4.  在PhoneStatusBar 中去重写onReceive方法。


 //add by huangbozhi
       public void onReceive(String action) {
           
           
           if (SystemUIService.ACTION_DISPLAY_STATUS_BAR.equals(action)) {
               Log.d(TAG, "*** onReceive() show" );
               addNavigationBar();
               
           } else if (SystemUIService.ACTION_HIDE_STATUS_BAR.equals(action)) {
               Log.d(TAG, "*** onReceive() hide" );
               
               mWindowManager.removeView(mNavigationBarView);
           }
       }


这样SystemUI 里的改动完成了。

5.  应用层实现;

隐藏时就发 sendBroadcast(new Intent("com.android.action.hide_navigationbar"));

显示时就发 sendBroadcast(new Intent("com.android.action.display_navigationbar"));





你可能感兴趣的:([置顶] android 4.2 隐藏/显示 navigation bar, 实现全屏显示)