现象
登陆成功,到首页后退回至欢迎页。没有crash日志,低概率偶线,但是影响到自动化部署,始终时不时的出现该问题。
分析问题
问题非必现,偶线概率也很小,但是仍然存在。
步骤:
欢迎页 -> 登陆页 -> 首页
确定问题大概是在登录页到首页之间的这段过程发生了某些未知问题。而且只发生在登陆成功之后。在登陆页到主页时大概是这样:
登陆:onPause -> 主页:onCreate -> 主页:onStart ->主页:onResume -> 登陆:onStop
定位问题
1、跟activity有关,先看了看各自的启动模式。
登陆的是singleTask,MainActivity是singleTop
2、分析登陆过程
onResume时动态注册了一个BroadcastReceiver,登陆成功后发个”LOGIN_SUCCESS”状态的广播。
Receiver接受到广播后,执行登陆成功回调和activity销毁
else if (MainServiceIntentType.LOGIN_SUCCESS.equals(intentAction)) {
loginSuc();
LoginActivity.this.finish();
loginSuc()的回调,这里执行了startMainActivity方法。
public void loginSuc() {
startMainActivity();
}
startMainActivity中主要是启动MainActivity和finish之前的Activity。并且在onStop中unbindService(unregisterReceiver)。
明眼卡看上去没什么问题,仔细的分析了下里面的过程。发现几个可能存在影响的地方。
1)unregisterReceiver的时机问题,一般来说是需要成对的。
onCreate - onDestroy
onResume - onPause
onStart - onStop
代码中我们是在onResume里注册了receiver,而解绑操纵放在了onStop里,这样可能会产生意外的影响。(才疏学浅,这方面还没研究透彻)。fix方法是在onPause执行super.onPause()之前,先执行unregisterReceiver操作。并且干掉onStop原来的解绑,避免重复unregisterReceiver产生错误。
2)几个finish逻辑不太好
Receiver里LoginActivity的finish()其实没必要。
另外在startMainActivity中销毁preActivity的时候的顺序也有点问题,调整一下把欢迎页放在前面,其他的放在后面
验证
重新部署自动化进行快速验证,登陆“闪退”的问题没有了。。。
那么实际上,就是与注册解绑和几个finish逻辑有关的地方,导致了这个非必现的奇怪的问题。
总结
真正的问题一定隐藏在代码中。。。