安卓自定义Launcher开发:如何永久禁用状态栏与底部导航栏
实现自定义独占Launcher并禁用系统导航栏/状态栏
看起来你已经迈出了第一步,我来帮你把剩下的环节补全,确保你的Launcher能独占系统且彻底隐藏系统栏:
首先先把你的AndroidManifest.xml配置补全优化,这是让应用被系统识别为Launcher的核心:
<application android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/FullscreenTheme"> <!-- 这里一定要用全屏主题 --> <activity android:name=".MainActivity" android:launchMode="singleTask" android:stateNotNeeded="true" android:excludeFromRecents="true"> <!-- 防止应用出现在最近任务列表里 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 这行必须加,否则系统不会把它列为可选Launcher --> </intent-filter> </activity> </application>
接下来分几个关键步骤处理:
1. 彻底隐藏状态栏和底部导航栏
我推荐结合主题配置和代码动态设置的方式,适配不同Android版本:
第一步:配置全屏主题
在res/values/styles.xml里定义一个专属的全屏主题:
<style name="FullscreenTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> <!-- 关闭系统栏背景绘制,避免残留空白 --> <item name="android:windowDrawsSystemBarBackgrounds">false</item> <item name="android:windowTranslucentNavigation">false</item> </style>
第二步:代码中设置沉浸式粘性模式
在MainActivity的onCreate方法里加入这段代码,确保系统栏被隐藏且不会轻易弹出:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隐藏状态栏和导航栏,开启沉浸式粘性模式 View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; decorView.setSystemUiVisibility(uiOptions); setContentView(R.layout.activity_main); }
另外,为了防止屏幕旋转或其他操作导致系统栏重新显示,重写onWindowFocusChanged方法:
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { // 重新应用全屏设置 View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; decorView.setSystemUiVisibility(uiOptions); } }
2. 确保Launcher仅显示自身应用
因为你的需求是只包含自身应用,所以不需要去加载系统应用列表,直接在MainActivity的布局里放置你需要的功能组件就行。如果要彻底阻止用户跳转到其他应用,还可以做这些处理:
- 禁用返回键(如果需要):
@Override public void onBackPressed() { // 空实现,阻止用户通过返回键退出到系统桌面 // 要是需要退出应用,可以改成双击返回的逻辑,比如: // if (System.currentTimeMillis() - lastBackPressedTime > 2000) { // Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show(); // lastBackPressedTime = System.currentTimeMillis(); // } else { // super.onBackPressed(); // } }
- 引导设置默认Launcher:第一次安装后,系统会让用户选择默认Launcher,要是担心用户没选对,可以在代码中检测并引导:
private boolean isMyLauncherDefault() { PackageManager pm = getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); String currentDefaultPackage = resolveInfo.activityInfo.packageName; return getPackageName().equals(currentDefaultPackage); } // 在onCreate里调用 if (!isMyLauncherDefault()) { Intent settingsIntent = new Intent(Settings.ACTION_HOME_SETTINGS); startActivity(settingsIntent); }
这样一套下来,你的Launcher就能独占系统,并且完全隐藏系统状态栏和导航栏了。
内容的提问来源于stack exchange,提问作者Alex D.




