Android11动态控制状态栏
1.setting中添加一个显示状态栏的开关控件:
1.1 布局xml文件:
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a63588a..ce66eba 100755 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -4976,6 +4976,10 @@ <string name="system_navibar">显示导航栏</string> <string name="system_navibar_tip">勾选打开导航栏</string> + <!--status_bar--> + <string name="system_statusbar">显示状态栏</string> + <string name="system_statusbar_tip">勾选打开状态栏栏</string> + <!--hdmi settings--> <string name="system_rotation">"系统方向"</string> <string name="screen_title">"屏幕设置"</string> diff --git a/res/values/strings.xml b/res/values/strings.xml index 11067d9..b611a15 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12247,6 +12247,10 @@ <string name="system_navibar" >navi_bar</string> <string name="system_navibar_tip" >Select navi_bar</string> + <!--status_bar--> + <string name="system_statusbar">status_bar</string> + <string name="system_statusbar_tip">Select status_bar</string> + <!--hdmi settings--> <string name="hdmi_settings">HDMI</string> <string name="system_rotation">System Direction</string> diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index 842e1e5..a635082 100755 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -77,6 +77,12 @@ settings:keywords="@string/system_navibar_tip" settings:controller="com.android.settings.display.NavigationBarController" /> + <SwitchPreference + android:key="system_status_bar_preference" + android:title="@string/system_statusbar" + settings:keywords="@string/system_statusbar_tip" + settings:controller="com.android.settings.display.StatusBarController" /> + <Preference android:key="adaptive_sleep_entry" android:title="@string/adaptive_sleep_title"
1.2 Java代码:
packages\apps\Settings\src\com\android\settings\display\StatusBarController.java
/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.settings.display; import android.app.settings.SettingsEnums; import android.content.Context; import android.text.TextUtils; import androidx.preference.Preference; import com.android.internal.view.RotationPolicy; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.TogglePreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.LifecycleObserver; import android.util.Log; import android.os.UserHandle; import android.content.Intent; import android.os.SystemProperties; public class StatusBarController extends TogglePreferenceController implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener{ private final MetricsFeatureProvider mMetricsFeatureProvider; private Preference mPreference; private RotationPolicy.RotationPolicyListener mRotationPolicyListener; public StatusBarController(Context context, String key) { super(context, key); mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } @Override public void updateState(Preference preference) { mPreference = preference; super.updateState(preference); } @Override public int getAvailabilityStatus() { return RotationPolicy.isRotationLockToggleVisible(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public boolean isSliceable() { return TextUtils.equals(getPreferenceKey(), "system_status_bar_preference"); } @Override public boolean isPublicSlice() { return true; } // @Override // public boolean isChecked() { // return !RotationPolicy.isRotationLocked(mContext); // } public boolean isChecked() { boolean isChecked; String nvbval = SystemProperties.get("persist.sys.statusbar"); if("1".equals(nvbval)){ isChecked = true; }else{ isChecked = false; } return isChecked; } @Override public boolean setChecked(boolean isChecked) { boolean value = isChecked; if (value == true) { // SystemProperties.set("persist.sys.statusbar", "1"); Intent intent = new Intent(); intent.setAction("com.android.StatusBar.status"); intent.putExtra("value", true); mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); } else{ // SystemProperties.set("persist.sys.statusbar", "0"); Intent intent = new Intent(); intent.setAction("com.android.StatusBar.status"); intent.putExtra("value", false); mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); } return true; } }
这里面实现了按钮的开关,发送相对应的广播给framework层,实现状态栏的显示或者隐藏。添加完成设置中显示如下:
2.framework层的实现:
2.1添加监听的广播:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index c20bce1..be58d18 100755 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1294,6 +1294,7 @@ public class StatusBar extends SystemUI implements DemoMode, filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); filter.addAction("com.android.navigation.status"); + filter.addAction("com.android.StatusBar.status"); mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL); } @@ -2826,6 +2827,12 @@ public class StatusBar extends SystemUI implements DemoMode, if(mNavigationBarView != null) return; createNavigationBar(mresult); } + }else if(intent.getAction().equals("com.android.StatusBar.status")){ + if(intent.getBooleanExtra("value",false)){ + SystemProperties.set("persist.sys.statusbar", "1"); + }else{ + SystemProperties.set("persist.sys.statusbar", "0"); + } } } };
2.2 通过读取persist.sys.statusbar属性,判断是隐藏还是显示状态栏:
packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarView.java
其中persist.sys.nvbshow这个属性的定义是从build.prop读取的。
device/rockchip/rk356x
diff --git a/rk3568_r/rk3568_r.mk b/rk3568_r/rk3568_r.mk
index 9af1129..6b36938 100755
--- a/rk3568_r/rk3568_r.mk
+++ b/rk3568_r/rk3568_r.mk
@@ -47,3 +47,4 @@ PRODUCT_PROPERTY_OVERRIDES += persist.bt.power.down=true
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.einit-1=1
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=true
PRODUCT_PROPERTY_OVERRIDES += persist.sys.nvbshow=0
+PRODUCT_PROPERTY_OVERRIDES += persist.sys.statusbar=0
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!