ANDROID 动态开关状态栏

    客户有个这样子的需求:首先系统中有个自带的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
                                }
         }
     以上就是更改的全部内容,有不对的,望各位指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值