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

本文介绍了在Android 4.2系统中通过修改SystemUI源码,实现隐藏和显示Navigation Bar,从而达到全屏显示的效果。主要步骤包括在SystemUI.java中添加onReceive方法,注册并接收ACTION_DISPLAY_STATUS_BAR和ACTION_HIDE_STATUS_BAR广播,以及在PhoneStatusBar中重写onReceive方法来控制导航栏的显示与隐藏。应用层可通过发送自定义广播来触发这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


引子:   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"));





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值