您的位置:首页 > 移动开发 > Android开发

android 4.2 隐藏/显示 navigation bar, 实现全屏显示

2013-09-25 10:03 288 查看
引子:   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"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: