客户有个这样子的需求:首先系统中有个自带的LANCHER APK,客户有个定制的LANCHER APK,这样子就有2个LANCHER,要求是:客户定制的LANCHER APK不带状态栏,并且从该LANCHER打开的APK,包括系统自带的APK都不显示状态栏,而从系统自带的LANCHER中打开的任何APK都显示状态栏;
1、首先,在device/rockchip/rk30sdk/device.mk下面增加一个变量:
persist.sys.fullscreen=normal
2、然后再在:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件中的updateSystemUiVisibilityLw函数中更改:
- final int visibility = mFocusedWindow.getSystemUiVisibility()
+ //final int visibility = mFocusedWindow.getSystemUiVisibility()
+ //& ~mResettingSystemUiFlags
+ //& ~mForceClearedSystemUiFlags;
+ final int visibility;
+ int temp= mFocusedWindow.getSystemUiVisibility()
& ~mResettingSystemUiFlags
& ~mForceClearedSystemUiFlags;
+ //Log.v(TAG, "yds ,SystemProperties.get persist.sys.fullscreen=" + SystemProperties.get("persist.sys.fullscreen",""));
+ if(SystemProperties.get("persist.sys.fullscreen","").equals("full")){
+ visibility=temp|View.SYSTEM_UI_FLAG_SHOW_FULLSCREEN;
+ }else{
+ visibility=temp;
+ }
在这里我们通过判断persist.sys.fullscreen的值,来决定是否要显示出状态栏;
3、在/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java文件下面增加广播的处理机制,在这里面监听广播来实现对persist.sys.fullscreen的值的控制,从而控制状态栏的显示;
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -809,6 +809,8 @@ public class TabletStatusBar extends BaseStatusBar implements
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction("com.cat.hidd_bar");
+ filter.addAction("com.cat.view_bar");
context.registerReceiver(mBroadcastReceiver, filter);
return sb;
@@ -1865,6 +1867,16 @@ public class TabletStatusBar extends BaseStatusBar implements
}
animateCollapse(flags);
}
+ //add by kia
+ if ("com.cat.hidd_bar".equals(action)) {
+ Log.d("cat","receiver com.cat.hidd_bar ");
+ SystemProperties.set("persist.sys.fullscreen","full");
+ }
+ if ("com.cat.view_bar".equals(action)) {
+ Log.d("cat","receiver com.cat.view_bar ");
+ SystemProperties.set("persist.sys.fullscreen","normal");
+ //Log.d("cat","yds ,SystemProperties.get persist.sys.fullscreen=" + SystemProperties.get("persist.sys.fullscr
+ }
}
};
4、注意在SYSTEMUI中对persist.sys.fullscreen的值更改必须具有SYSTEM的权限,按如下更改SYSTEMUI就具备了SYSTEM的权限了
--- a/frameworks/base/packages/SystemUI/AndroidManifest.xml
+++ b/frameworks/base/packages/SystemUI/AndroidManifest.xml
@@ -1,5 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.systemui"
+ android:sharedUserId ="android.uid.system"
coreApp="true">
5、最后就是选择发送广播的时机了,什么时候发送广播显示状态栏,什么时候发送广播隐藏状态栏,这个根据具体情况而定,这里就不说明了;
6、当上面的全部更改完成以后,确实实现了动态隐藏状态栏的功能,但是还存在一个小问题,就是状态栏中的menu并没有受隐藏或者显示状态栏的影响,在隐藏了状态栏的情况下,打开一些APK的时候,状态栏中的menu照样会显示出来,这就导致了状态栏隐藏不成功了;
为什么状态栏中的menu会不受控制呢,通过找资料发现当:android:minSdkVersion设置的值小于10的时候,状态栏中的menu 键就会显示出来,而我现在使用的是android 4.1的系统,所以才会出现这个问题,通过下面的更改,我们可以修正这个问题;
更改的文件:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -106,7 +106,7 @@ public class TabletStatusBar extends BaseStatusBar implements
public static final boolean DEBUG_COMPAT_HELP = false;
public static final String TAG = "TabletStatusBar";
-
+ public static boolean hideMenubutton=false;
public static boolean HIDE_TABLET_STATUSBAR=false;
public static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001;
@@ -1328,6 +1328,9 @@ public class TabletStatusBar extends BaseStatusBar implements
if (DEBUG) {
Slog.d(TAG, (showMenu?"showing":"hiding") + " the MENU button");
}
+ //Slog.d(TAG, (showMenu?"showing":"hiding") + " the MENU button yds");
+ if(hideMenubutton)
+ showMenu=false;
mMenuButton.setVisibility(showMenu ? View.VISIBLE : View.GONE);
// See above re: lights-out policy for legacy apps.
@@ -1871,10 +1874,12 @@ public class TabletStatusBar extends BaseStatusBar implements
if ("com.cat.hidd_bar".equals(action)) {
Log.d("cat","receiver com.cat.hidd_bar ");
SystemProperties.set("persist.sys.fullscreen","full");
+ hideMenubutton=true;
}
if ("com.cat.view_bar".equals(action)) {
Log.d("cat","receiver com.cat.view_bar ");
SystemProperties.set("persist.sys.fullscreen","normal");
+ hideMenubutton=false;
//Log.d("cat","yds ,SystemProperties.get persist.sys.fullscreen=" + SystemProperties.get("persist.sys.fullscr
}
}
以上就是更改的全部内容,有不对的,望各位指正!