问题产生:
因为开发时,要做微信登录,再登录时,测试告诉我,微信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;
}
}