关于home键后,App重走冷启动页的处理

本文分析了一个App在特定情况下重复登录的问题,并详细解释了不同安装方式导致的行为差异。通过调整Activity启动逻辑,解决了由系统安装器安装的应用在按下Home键后再打开时重复登录的现象。

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

问题产生:

因为开发时,要做微信登录,再登录时,测试告诉我,微信code失效,但是还登录成功了。

分析原因:

1、根据自己写的代码,想到代码已经做了各种判断,所以不可能code失败,还登录成功的情况,但是事实就是摆在面前,确实登录成功了,对着自己写的app,自测了一下午,终于找清楚此问题的复现步骤,即:每次如果使用adb装的app,则不会出现此问题,如果使用了系统安装器(即,打好包,放到sd卡,点击安装),就会出现此问题,按下home键,每次再打开app,就会重走冷启动页,我就猜测,会不会,登录页启动了两次,导致登录接口调用了2次,一次成功登录,一次微信code失效..
2、让服务端的同学给看了下,验证了猜测,正式接口调用多次。
简单的梳理了下,复现步骤与原因,但是还是没找到根本原因(为什么系统安装器安装的app,按下home键之后,再点击app的logo进去app,会多次调用冷启动页);

简单说下复现步骤:

相信每个app大致都有的流程是这样的,SplashActivity(启动页) -->LoginActivity(登录页)-->HomeActivity(主页)
1. 系统安装器安装的形式安装后,点击打开进去到app,走SplashActivity——>loginActivity—>HomeActivity,
2. 按下手机Home键,回到手机主界面,再次点击app的logo进app,这时,会重新走SplashActivity—>LoginActivity—>HomeActivity
3. 如果完全退出应用后,再以点击app的logo的形式,进app;
4. 按下手机Home键,回到手机主界面,再次点击launcher进去到app,此时,直接到了HomeActivity页,此后变正常。
5. 经过在,BaseActivity里,使用List存储了Activity的引用,发现每次Home键,再打开,都会多一个LoginActivity的引用。经过一番查阅资料最后找到了原因;
原文链接

这是因为

1、SplashActivity用安装器打开应用flag为FLAG_ACTIVITY_NEW_TASK,launcher打开应用比系统安装器多了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
2、用FLAG_ACTIVITY_NEW_TASK创建的任务栈,再用FLAG_ACTIVITY_RESET_TASK_IF_NEEDED(launcher方式)打开,会在AAActivity多了FLAG_ACTIVITY_BROUGHT_TO_FRONT
3、异常重复启动过程中,新建SplashActivity的TaskId与Pid一致,可确定还是在原有任务栈中创建Activity,打开多次LoginActivity(standard启动模式)会在原有任务栈中叠加。

解决办法:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//判断SplashActivity是否位于栈底
if (!isTaskRoot()) {
finish();
return;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值