Android 防止每次打开APP都显示启动页

测试发现的一个问题,在某台小米设备上,打开App后操作,按home键,再次点击桌面图标进入APP,此时会重新打开一次启动页SplashActivity,解决方法,在启动页的onCreate方法中添加如下代码,直接上code;

c 复制代码
    if (!this.isTaskRoot()) {
            Intent intent = getIntent();
            if (intent != null) {
                String action = intent.getAction();
                if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
                    finish();
                    return;
                }
            }
        }

if (!this.isTaskRoot())

isTaskRoot() 是 Activity 类中的一个方法,用于判断当前 Activity 是否是任务栈的根 Activity。如果当前 Activity 不是栈中的第一个活动(根活动),则返回 false,进入 if 语句块。

Intent intent = getIntent();

getIntent() 获取当前 Activity 启动时传入的 Intent。

if (intent != null)

确保 Intent 对象不为空,继续进行检查。

String action = intent.getAction();

从 Intent 获取动作(action),即启动 Activity 时指定的 action 字符串。

if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action))

这里检查 Intent 是否包含 CATEGORY_LAUNCHER 分类,并且 action 是否为 ACTION_MAIN。

CATEGORY_LAUNCHER 用来标识应用程序的启动入口。

ACTION_MAIN 是启动应用程序时传递的标准动作,通常用于表示主屏幕上的图标点击。

这意味着,当用户从主屏幕点击应用图标启动应用时,Intent 应该包含 CATEGORY_LAUNCHER 和 ACTION_MAIN。

finish();

如果满足上述条件(即当前 Activity 不是根 Activity,并且它是通过点击启动图标而来),则调用 finish() 来结束当前 Activity,这会将当前 Activity 从栈中移除。

return;

调用 finish() 后,直接返回,不再执行后面的代码。

目的:

这段代码的目的通常是为了防止用户在某些情况下重复启动 MainActivity,并保持任务栈的整洁。

任务栈:每当用户打开一个应用时,Android 会为该应用创建一个任务栈(Task),栈顶是当前正在显示的 Activity。

根 Activity:任务栈的第一个 Activity 称为根 Activity,通常是应用的主界面(例如 MainActivity)。

具体场景:

假设用户从其他界面回到 MainActivity,并且 MainActivity 已经存在于栈中,但用户再次点击应用图标时,Android 会重新启动 MainActivity。这段代码的目的是避免这种情况,如果当前的 Activity 不是根 Activity,且它是通过点击启动图标来启动的(符合 CATEGORY_LAUNCHER 和 ACTION_MAIN),则调用 finish() 结束当前 Activity,防止用户再次进入 MainActivity。

相关推荐
古法安卓2 小时前
Android-Direct Boot 阶段与 getFilesDir() 路径变更问题深度分析
android·java·android studio
阿巴斯甜2 小时前
Android Studio Detekt 使用
android
杉氧2 小时前
Flutter 跨平台多端适配与 Android/iOS 一键自动化打包发布
android·前端·flutter
Super 含3 小时前
Android 包体积优化(一):APK 到底大在哪里?从 APK 结构到体积分析
android·ide·vscode
Super 含4 小时前
Android 包体积优化(四):深入 ReDex——StripDebugInfo、InterDex 与 DEX 重排
android
安卓与AI研习社4 小时前
主线程明明是空闲的,为什么仍然 ANR?3 个真实 Trace 的证据链复盘
android
恋猫de小郭5 小时前
Dart 3.13 大更新,感觉比 Flutter 更带劲
android·前端·flutter
大锅盖16 小时前
HarmonyOS 6.1.1 ArkWeb:交付门户下载资料前-为什么必须先登记下载代理与来源字段
android·华为·harmonyos
峥嵘life14 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
Kapaseker15 小时前
破坏性更新 - 解读 Jetpack Compose 1.12
android·kotlin