最近时间充足对Activity启动做了一个充分的了解,打算记录一下。对Activity的启动流程,就不做源码的解释了,网上有好多资料。我只记录一下我们开发者能做的一些优化。
场景描述
每个应用都会有启动页,在这个页面我们会做很多事,比如处理应用需要用到的权限、拉取广告的信息等等。
不知道大家有没有发现,如果在我们启动页Activity不做任何处理的情况下,用户从手机桌面点击我们的应用logo,会出现一段时间白屏然后才会看到我们启动页的布局。
对上述的情况我有三个疑问
1.为什么会出现白屏呢?
2.这个白屏出现的时间是多久?
3.我们做什么才能向其他大厂的APP那样,桌面点击logo马上就能看到启动页的布局?
首先简单的介绍一下为什么会出现白屏。
当应用进程不存在的情况下,从用户点击应用logo到看到我们启动页的布局,这中间系统帮我们做了很多事,流程如下图

通过这幅图我们可以对Application和Activity的创建有一个基本的了解。
其实造成白屏的原因是因为系统在启动应用的时候会先将屏幕填充为主题默认的背景色,一直等到Application和Activity创建完成,ViewRoot执行完测量,布局,绘制后我们才能看到编写布局。
这个白屏出现的时间是多久?
白屏停留的时间 等于Application创建的时间 + Activity创建的时间 + 布局复杂度的总和。
我们做什么才能向其他大厂的APP那样,桌面点击logo马上就能看到启动页的布局?
既然知道了白屏从哪来我们可以从以下几点入手。
1、减少白屏的停留时间,其实这是启动优化的根本
- 不要在Application和Activity的OnCreate执行耗时的操作。
- 在Application的OnCreate方法中把一些不必要初始化的SDK,放到线程中去初始化,可以使用IntentService。
- 优化Activity的布局层级,尽量减少布局嵌套,不必马上展示的使用ViewStub标签。
2、主题默认的背景色
就算我们把白屏停留的时间做到最优,其实还是会出现短暂的白屏现象。
我们通过上面的分析知道这个白屏其实是当前Activity默认主题的背景颜色,那么我们就可以通过修改这个背景色,来彻底解决白屏问题。
在style文件编写当前Activity主题
到这里就有两种解决方案
第一种
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
启动页Activity主题设置如上代码,利用windowIsTranslucent这个属性把当前主题背景改成透明,效果是用户点击logo因为背景为透明所以用户看到的还是桌面。
不推荐这么写,感觉跟卡了似的,用户体现不好。
第二种
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_bg</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
利用windowBackground属性,自己编写drawable文件来实现启动页效果。
splash_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#FFFFFF"/>
</shape>
</item>
<item >
<bitmap
android:gravity="center"
android:src="@drawable/btn"/>
</item>
<item >
<bitmap
android:gravity="bottom"
android:src="@drawable/btm"/>
</item>
</layer-list>
网友评论