前几天分析一个APP崩溃的问题,APP启动之后跟了几秒钟然后突然挂掉了,打印里面有Launch timeout has expired, giving up wake lock这个LOG,网是查了下说是启动超时.但是一直不太理解,然后把startactivity流程仔细看了一遍,大概看明白了什么情况下会出现这个问题.
1.在activitystack.java文件里面
函数resumeTopActivityInnerLocked是拉Activity的真正入口地方,在这个函数里面会
这两个拉起activity的入口基本都是直接或间接在这个函数里面拉起来的。在开始拉的时候会判断目前有没有Activity正处于Resumeing状态
如果有就停止它,并拉起一个10S的Delay(相当定时器)
这里就是延迟10S,发一个TIMEOUT的信息。当10S内被PAUSE的程序执行完成后会remove这个消息,没有的话就倒霉了。那么mResumedActivity这个对象变量是哪里被赋值哪里又被清空呢。在正常流程下,在resumeTopActivityInnerLocked函数里面,要拉起activity的时候(无论是LAUNCHER还是RESUME)就会为这个对象赋值,resumeTopActivityInnerLocked->setResumedActivityLocked 如图
哪又是什么时候清空的,在程序拉起完成之后清空的,如下图
finishActivity->requestFinishActivityLocked->finishActivityLocked->finishCurrentActivityLocked.
那么就很清楚了,当应用启动时判断当前有没有正在启动的activity,如果有就停止它并拉起一个10S的计时器。停止成功就取消计时器。继续执行,把当前招待设置成正在启动的activity并开始拉activity,拉成功之后就把正在启动的变量设置为NULL。那么问题来了,如果你上个APP启动没完成你马上又启动自己的APP,如果那个APP oncreate onresume onpause写的很乱并阻塞,结果你自己写的APP挂了,不是很倒霉?