记一次android任务栈页面跳转问题

本文探讨了一键登录过程中,不同Activity的启动模式如何影响任务栈行为,尤其是在闪验SDK登录后,为何切换至账号密码登录页面会导致任务栈意外切换。作者揭示了finish操作与任务栈创建的关系,并提供了排查和解决方案,强调了启动模式和任务管理在复杂应用中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
应用需求首次打开app,进入SplashActivity页面,如果支持一键登录功能,
直接跳转到闪验sdk(创蓝闪验集成三网运营商)一键登录页面,该sdk中页面只支持代码定制UI以及接口返回控制,有点坑。当进入一键登录页面,切换到app的账号密码登录页面,使用账号密码登录成功跳转到app首页之后,连续按2次返回键,finish掉当前主页,app回到桌面,这个时候如果从近期任务进入app,发现没有进入splash页面-判断token有效-静默成功登录到主页,而是直接进入了账号密码登录页面,匪夷所思,怀疑人生了,按照正常流程是返回键finish掉了栈里面的全部activity,下次近期任务进入也是从SplashActivity开始,静默登录到主页。。。

问题排查:
SplashActivity—android:launchMode=“standard”
PwdLoginActivity—android:launchMode=“singleTask”
闪验sdk一键登录 ShanYanOneKeyActivity— android:launchMode=“singleTask”
MainActivity—android:launchMode=“singleTask”

SplashActivity、PwdLoginActivity、MainActivity是自己的app中的代码,没有设置任何的taskAffinity,默认都是在同一个任务栈中运行的,排查了ShanYanOneKeyActivity也配置的一样的taskAffinity,应该都是在一个task栈中,全部finish掉了,近期任务打开就应该的SplashActivity啊,这个是理论上的,实际还是需要验证,有没有更直观的方法呢?百度

adb shell dumpsys activity activities|findstr “app进程的名字”,运行后结果如下,可以直观的看到当前的activity属于哪个任务栈的
在这里插入图片描述

分析发现,首次启动应用
首次打开SplashActivity,查看当前的所属任务栈ID为 t49000,支持一键登录
自动跳转到一键登录页ShanYanOneKeyActivity,所属任务栈ID为 t49000(SplashActivity再执行 finish操作),
再次切换到 PwdLoginActivity账号密码登录页面,发现所属任务栈ID为 t49001
之后输入账号密码跳转到主页(PwdLoginActivity再finish),发现所属任务栈ID为 t49001
连续2次返回键,finish掉自己,退回到桌面了,再次近期任务进入,问题复现
进入PwdLoginActivity,发现所属任务栈ID为 t49001

也就是说,首次从ShanYanOneKeyActivity跳转到PwdLoginActivity切换了任务栈,导致
PwdLoginActivity、后面的登录成功页面都在 t49001 中运行,返回键退出了t49001栈中所有的界面,再次从近期任务进入,会打开该任务栈的入口,也就是PwdLoginActivity界面。

问题来了,为啥ShanYanOneKeyActivity跳转到PwdLoginActivity会创建新的任务栈,而不是t49000呢???

通过编写简易demo最终发现问题,

t49000栈中只有ShanYanOneKeyActivity,跳转到PwdLoginActivity,如果是先finish 自己 ShanYanOneKeyActivity,再跳转到
PwdLoginActivity,就会创建一个新的任务栈,如果是先跳转到PwdLoginActivity,再finish自己,就会共用一个任务栈ID为 t49000。至于具体原因,猜测是先finish自己,栈被回收了,这个时候打开PwdLoginActivity 不能复用t49000,所以创建新的,有待验证。

排查代码,发现再接入一键登录时候,复制demo的代码,默认true 先finish后跳转,导致出现这个问题。
在这里插入图片描述

改正为自己控制,打开的密码登录页,再关闭一键登录页面,会复用了上一个栈,问题解决。
在这里插入图片描述
总结
任务栈启动模式看似简单,内部原理很复杂,遇到问题再研究吧。。。

一些实用的命令
adb shell dumpsys activity activities|findstr com.example.myapplication

adb shell dumpsys activity activities|findstr mFocus

10.27
activity1跳转到activity2,没有问题

  Intent intent = new Intent(LotteryActivity.this, RecordActivity2.class);
            intent.putExtra("type", type);
            intent.putExtra("type2", type2);
            LotteryActivity.this.startActivity(intent);

如果使用activity1使用 ApplicationContext跳转到activity2,必须携带newtask,
因为不知道当前属于哪个栈,否则报错

android.util.AndroidRuntimeException: Calling startActivity() from
outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK
flag. Is this really what you want?

Intent intent = new Intent(getApplicationContext( ), RecordActivity2.class);
intent.putExtra(“type”, type);
intent.putExtra(“type2”, type2);
LotteryActivity.this.startActivity(intent);
在这里插入图片描述
需要添加

  intent.setFlags(FLAG_ACTIVITY_NEW_TASK)

导致新的activity,以及后面的activity,都在一个新的task栈运行!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值