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。

相关推荐
努力努力再努力wz22 分钟前
【MySQL入门系列】掌握表数据的 CRUD:DML 核心语法与执行逻辑解析
android·开发语言·数据结构·数据库·c++·b树·mysql
zh_xuan3 小时前
Android gradle任务
android·gradle构建
Grackers3 小时前
Android Perfetto 系列 10:Binder 调度与锁竞争
android·binder
李白你好3 小时前
Android 自动化渗透测试指令生成
android·自动化
CeshirenTester4 小时前
Claude Code 不只是会写代码:这 10 个 Skills,才是效率分水岭
android·开发语言·kotlin
朝星6 小时前
Android开发[2]:Flow
android·kotlin
zzb15806 小时前
Android Activity 与 Intent 学习笔记
android·笔记·学习
studyForMokey6 小时前
【Android面试】动画 & Bitmap
android·面试·职场和发展
黑牛儿7 小时前
面试高频问题:从浏览器请求到PHP响应:完整流程拆解
android·后端·面试·php
y小花8 小时前
安卓USB服务概述
android·usb