if (!a.mWindowAdded) {
a.mWindowAdded = true;
wm.addView(decor, l);
看上面的代码,就先放结论了。
在performResumeActivity 中进行了onResume的回调,在wm.addView 中进行了绘制,因此onResume的方法是在绘制之前,在onResume中做一些耗时操作都会影响启动时间。
下面就剥一下onResume的逻辑,绘制的有兴趣可以自己看源码。 首先performResumeActivity中会调用r.activity.performResume();
public final ActivityClientRecord performResumeActivity(IBinder token,
boolean clearHide, String reason) {
//省略部分代码
try {
r.activity.onStateNotSaved();
r.activity.mFragments.noteStateNotSaved();
checkAndBlockForNetworkAccess();
if (r.pendingIntents != null) {
deliverNewIntents(r, r.pendingIntents);
r.pendingIntents = null;
}
if (r.pendingResults != null) {
deliverResults(r, r.pendingResults);
r.pendingResults = null;
}
r.activity.performResume();
//省略部分代码
}
}
然后在performResume中调用了 mInstrumentation.callActivityOnResume(this);
final void performResume() {
//省略部分代码
mInstrumentation.callActivityOnResume(this);
//省略部分代码
}
最后在callActivityOnResume 调用了onResume
public void callActivityOnResume(Activity activity) {
activity.mResumed = true;
activity.onResume();
//省略代码
}
到了此处就算真正调用到了onResume的方法。
既然知道了onResume中做的操作会影响到启动时间,那么就有一个优化启动时间的思路了。
思路
把在onResume以及其之前的调用的但非必须的事件(如某些界面View的绘制)挪出来找一个时机(即绘制完成以后)去调用。那样启动时间自然就缩短了。但是整体做的事并没有明显变化。那么这个时机是什么呢?
IdleHandler
看下IdleHandler的源码
/**
- Callback interface for discovering when a thread is going to block
- waiting for more messages.
/
public static interface IdleHandler {
/* - Called when the message queue has run out of messages and will now
- wait for more. Return true to keep your idle handler active, false
- to have it removed. This may be called if there are still messages
- pending in the queue, but they are all scheduled to be dispatched
- after the current time.
*/
boolean queueIdle();
}
从这个源码可知道,IdleHandler即在looper里面的message处理完了的时候去调用,这不就是我们onResume调用完了以后的时机么。
来一张图说明一下,明显的IdleHandler在onResume以及performTraversals绘制之后调用
由这个思路我把自己负责的页面中的一些界面的绘制逻辑挪到了IdleHandler中,由于有LoadingView时间,我把Adapter的绑定也挪出去了。看下优化前后效果图效果还是挺明显的。
参考资料
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ps://bbs.youkuaiyun.com/topics/618165277)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!