App 冷启动缓慢出现白屏之终极解决方案 — IntentService 高效异步处理

App 冷启动缓慢出现白屏之终极解决方案 — IntentService 高效异步处理_第1张图片

什么叫做冷启动

第一次启动或者被用户主动杀死app进程,或者被系统主动回收掉,整个app的后台任务被清理,回到桌面再次点击app的桌面图标启动app。

特点

后台任务全部结束,再次启动

当然还有与之对应的热启动

热启动

用户点击返回键退推到桌面上,后台任务没有被杀死。再次点击桌面图标启动app

特点

未清理后台任务,再次启动

app启动时,每一个app都会至少创建一个进程出来,一些启动多线程任务的会创建出来多个进程。

为什么会出现白屏现象

首先我们要知道当打开一个Activity的时候发生了什么?

  • 在一个Activity打开时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程

  • 每创建一个进程都会调用一次Application,所以Application的onCreate()方法可能会被调用多次

  • 在进程的创建和初始化中,势必会消耗一些时间,在这个时间里,WindowManager会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素,然后才去真正的加载布局

  • 如果这个时间过长,而默认的背景又是黑色或者白色,这样会给用户造成一种错觉,这个APP很卡,很不流畅,自然也影响了用户体验。

效果图对比较:

启动过长出现白屏效果:

利用IntentService优化后的效果:

[图片上传失败...(image-c0d02f-1569589200786)]

利用IntentService优化后的效果

在application里做一些耗时的一些逻辑:

App 冷启动缓慢出现白屏之终极解决方案 — IntentService 高效异步处理_第2张图片

利用IntentService进行帮助application逻辑相关的异步处理

App 冷启动缓慢出现白屏之终极解决方案 — IntentService 高效异步处理_第3张图片

MyIntentService:

App 冷启动缓慢出现白屏之终极解决方案 — IntentService 高效异步处理_第4张图片

该项目是一个关于GreenDao的一个学习案例

App 冷启动缓慢出现白屏之终极解决方案 — IntentService 高效异步处理_第5张图片

:

相关该用例中的demo相关CSDN连接:
download.csdn.net/detail/andr…

另外参考了网上的另外2种方式这里也进行总结一下.

  • 1、将背景图设置成我们APP的Logo图,作为APP启动的引导,现在市面上大部分的APP也是这么做的。

  • 2、将背景颜色设置为透明色,这样当用户点击桌面APP图片的时候,并不会"立即"进入APP,而且在桌面上停留一会,其实这时候APP已经是启动的了,只是我们心机的把Theme里的windowBackground的颜色设置成透明的,强行把锅甩给了手机应用厂商(手机反应太慢了啦,哈哈),其实现在微信也是这样做的