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