android 11 动态显示隐藏状态栏
时间: 2024-09-06 19:03:18 浏览: 60
Android 动态显示和隐藏状态栏详解及实例
在Android 11(API级别30及以上)中,动态调整状态栏的行为变得更加复杂,因为Google引入了更严格的隐私和权限管理。如果你想在运行时动态地改变应用是否显示或隐藏状态栏,你需要遵守以下步骤:
1. **检查权限**:
首先,确保你的应用已经有了`SYSTEM_UI_FLAG_ADJUST_WITH_ACTIVITY`权限。这可以通过在AndroidManifest.xml文件中的`<activity>`标签添加`android:configChanges="orientation|screenSize"`属性以及相应的`<uses-permission>`来获取:
```xml
<activity
...
android:configChanges="orientation|screenSize"
android:requestLegacyExternalStorage="true">
<meta-data
android:name="android.support.UI_OPTIONS"
android:value="splitActionBarWhenNarrow"/>
...
</activity>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
```
2. **使用Policy API**:
使用`WindowManager.LayoutParams.FLAG_FULLSCREEN`标志来控制状态栏的显示。但是请注意,从API 30开始,直接设置全屏可能被拒绝。你应该使用`SystemUiVisibility`枚举来间接更改:
```java
import androidx.annotation.RequiresApi;
import android.view.View;
import android.view.WindowManager;
@RequiresApi(api = Build.VERSION_CODES.R)
public void toggleStatusBar(View view) {
int visibility = view.getSystemUiVisibility();
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
// 显示状态栏
view.setSystemUiVisibility(visibility | View.SYSTEM_UI_FLAG_FULLSCREEN);
} else {
// 隐藏状态栏
view.setSystemUiVisibility(visibility & ~View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
```
3. **响应系统通知**:
Android 11要求你在`onCreate()`, `onConfigurationChanged()`等生命周期回调中处理`ACTION_CLOSE_SYSTEM_DIALOGS`广播,以适应系统的全屏模式变化。
4. **适配Android 11的Scoped Storage**:
如果你的应用依赖于`ACTION_EXTERNAL_APPLICATIONS_AVAILABLE`广播来检测外部存储的变化,那么在Android 11中可能需要进行额外的权限管理和适配。
记得,在实际开发过程中,要根据设备的实际行为进行测试,因为某些厂商可能会提供自己的定制版本,对这些API的响应可能有所不同。
阅读全文