当前位置: 首页 > article >正文

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

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

    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。


http://www.kler.cn/a/506013.html

相关文章:

  • Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证5)
  • 一文读懂高频考题!进程、线程、协程最全方位对比剖析
  • 怎么防止SQL注入攻击
  • 12 USART串口通讯
  • 深度剖析RabbitMQ:从基础组件到管理页面详解
  • 接口传参 data格式和json格式区别是什么
  • 基于Springboot + vue实现的旅游网站
  • LeetCode 3280. 将日期转换为二进制表示
  • HTML常用元素及其示例
  • react中hooks之useEffect 用法总结
  • 嵌入式Linux:什么是进程?
  • php基本数据结构
  • docker 部署 MantisBT
  • 基于AD硬件开发(2) --- Altium Designer 布线后排查漏线
  • k8s 的网络问题进行检查和诊断
  • Dexie.js内存管理技巧:在大型数据集操作中避免浏览器崩溃
  • matlab程序代编程写做代码图像处理BP神经网络机器深度学习python
  • Kotlin函数类型探索:T.()->Unit的扩展函数、无参函数()->Unit与类型参数函数(T)->Unit
  • 永久免费工业设备日志采集
  • 在VS2022中用C++连接MySQL数据库读取数据库乱码问题
  • RK3568 Android11 锁屏界面屏蔽下拉状态栏
  • SIBR详细介绍:基于图像的渲染系统及3DGS实例展示【3DGS实验复现】
  • 金仓Kingbase客户端KStudio报OOM:Java heap space socketTimeout
  • Subprocess check_output returned non-zero exit status 1
  • APKLeaks:一款针对APK文件的数据收集与分析工具