启动方式
安卓应用的启动方式分为三种:冷启动、暖启动和热启动。应该根据冷启动假设进行优化,这样做也可以提高热启动和暖启动的性能。
冷启动
冷启动是指应用从头开始:在开始之前,系统的进程尚未创建应用程序的进程。冷启动发生在应用自启动设备以来第一次启动或自系统杀死应用程序以来的情况。这种启动是最耗时的。
在冷启动开始时,系统有三项任务:
* 加载和启动应用程序。
* 启动后立即显示应用程序的空白起始窗口。
* 创建应用程序进程。
系统创建应用程序进程,应用程序进程就负责下一个阶段:
* 创建应用程序对象。
* 启动主线程。
* 创建主要Activity。
* 绘制视图。
* 填充屏幕。
* 执行初始化绘制。
一旦应用程序进程完成第一次绘制,系统进程便会将当前显示窗口换掉,并将其替换为主要Activity。此时,用户可以开始使用该应用程序。
创建应用程序
当应用程序启动时,空白的窗口将停留在屏幕上,直到系统第一次完成绘制应用程序。此时,系统进程会为应用程序换掉启动窗口,允许用户开始与应用程序进行交互。
如果Application.onCreate()
被重载,系统会调用onCreate()
重载的方法。之后,应用程序会生成主线程(也叫UI线程),并执行创建主要Activity的任务。
从这开始,系统和应用程序级别的进程将按照应用程序生命周期阶段进行。
创建Activity
程序创建Activity后,该Activity执行一下操作:
* 初始化值。
* 调用构造函数。
* 调用回调方法,例如Activity.onCreate()
适合活动的当前生命周期状态。
通常情况下,该onCreate()
方法对加载时间影响最大,因为它以最高开销执行工作:加载和绘制视图,以及初始化Activity运行所需的对象。
热启动
热启动比冷启动相对简单,所以开销更低。在热启动时,所有系统都会将您的活动带到前台。如果所有程序的Activity驻留在内存中,则该程序可以避免重复初始化对象、布局的填充和渲染。
但是,如果某些内存已被清除以响应内存过低事件(例如onTrimMemory()
,那么这些对象将需要重新创建以响应热启动事件。
热启动显示与冷启动场景有相同的屏幕行为:系统进程显示空白屏幕,直到程序完成渲染Activity。
暖启动
暖启动涵盖了冷启动期间发生的一下操作子集;与此同时,它的开销比热启动要小:
* 当用户退出程序,重新启动程序。进程还在运行没有被杀死,但应用必须重新走onCreate()
。
* 系统回收程序的内存,用户重新启动程序。进程和Activity需要重新开始,但可以从之前的状态回去数据,重新走onCreate()
。
为什么会出现白屏/黑屏
一般有两个原因。一个是在Application中初始化的东西过于耗时,比如:I/O流的操作,网络请求等。另一个是主Activity绘制布局需要时间比较长。这两个原因会导致程序启动慢,但白屏/黑屏是怎么回事呢?是因为,主题的设置,正常主题就会出现白屏;夜间模式主题就出现黑屏现象。
优化
好了,既然知道了程序是怎启动的以及出现白屏/黑屏的原因,那么接下来就是优化它:
<item name="android:windowDisablePreview">true</item>
关闭启动窗口,但你会发现,点击应用图标后没反应,过了一会才启动。居然不好用,你居然骗我。美团怎么做到秒开的呢?
<item name="android:windowBackground">@drawable/branded_launch_screens</item>
要设置这个属性的,给窗口设个背景。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<!--黑色背景颜色-->
<item android:drawable="@android:color/black" />
<!-- 产品logo-->
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/empty_image01" />
</item>
<!-- 右上角的图标元素 -->
<item>
<bitmap
android:gravity="top|right"
android:src="@mipmap/github" />
</item>
</layer-list>
其中android:opacity=”opaque”参数是为了防止在启动的时候出现背景的闪烁。
这样应用就可以秒开了,由于是设置了窗口的背景,所以这个主题只能用在主Activity上,并且会显示出来。然后在显示登陆按钮啊、注册按钮啊。这些都随你了。
其实这还不是最好的方案,最佳的方案是执行个动画。这样体验总比你简单的展示个图片要好多了。
这里直接给大神的地址: