Launch timeout has expired, giving up wake lock

解析APP启动超时机制
本文深入探讨了APP启动过程中出现“启动超时”的原因,详细解析了在ActivityStack中,如何通过resumeTopActivityInnerLocked函数判断并处理正在启动的Activity,避免因前一应用未完全启动而导致的当前应用崩溃问题。

前几天分析一个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挂了,不是很倒霉?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruk_spp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值