You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

安卓自定义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>

第二步:代码中设置沉浸式粘性模式

MainActivityonCreate方法里加入这段代码,确保系统栏被隐藏且不会轻易弹出:

@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.

火山引擎 最新活动