文章目录
  • 前几天在解决应用中一个问题,现象是在nexus 7.0以上系统的手机上创建群组会话时,消息发送超时。然后测试了一上,发现是必现的,而4.4系统的手机上却一切正常,于是一路分析了别人写的代码。最后找到原因并解决,于是就有了本文。

最后找到原因是在Android系统7.0以上,当把Activity的launchMode属性值设置为singleTop时,Activity的生命周期与以前的系统版本对应的生命周期有所不同。

我们都知道从Activity A启动了个Activity B,并在A中调用finish()方法关闭A时,整个过程的生命周期的方法调用顺序是:先调用B的onCreate(),然后再调用A的onDestroy()。android系统这样做可能是为了提高系统的响应的速度,让应用以最快的速度看到UI发生变化,而不是从系统的角度考虑,先回收资源,资源回收OK了,再创建新的资源,所以就有了上面的这样生命周期方法的调用顺序。但在android 7.0系统以前有个例外情况:

假如Activity A的launchMode属性值被设置为singleTop时,如果Activity A启动Activity B,在B中又启动了A,同时关闭B,如下图所示:

singleTop流程图

  • 此时A的生命周期方法的调用是:

先调用A的onDestroy方法,用来关闭以前被启动的旧的Activity A,然后再调用在B中新startActivity的A的onCreate方法。

那么这里所说的生命周期与前面所说的情况不一样,就因为设置了一个singleTop值。

  • 这个是android系统7.0以前的,那么7.0以后的系统上走上述同样的流程,生命周期的方法调用顺序是:

先调用新的Activity A的onCreate方法,然后再调用旧A的onDestroy方法。

发现这里与没有设置singleTop值时的生命周期一致,形成了统一。

以上就是问题的原因,因为系统的差异造成的。由于使用的是google官方出的nexus系列手机测试,而又是使用原生的系统,可以认为是android官方系统这块的逻辑处理发生了变化。

好了,下面就说实际遇到的场景:

因为在Activity A中的onDestroy方法中调用了关闭会话,并将一个全局的状态值修改为非法值,而在onCreate方法中是重新初始化这个状态值。因为生命周期方法调用顺序在不同的系统上实现的差异,而导致这个状态值设置OK后,又被修改成非法值,从而使发送消息出去的报名格式发生变化,而服务器端在接收这个程序性错误后没有异常反馈,而终端则认为是服务器端没有响应而当作超时处理,所以发送失败。

从上面现象可以看出系统后台设计人员并没有对这些程序性非业务逻辑性错误作出错误反馈,而后台有没有Log记录呢?

文章目录