借鉴:http://blog.csdn.net/yanzhenjie1003/article/details/52201896?utm_source=tuicool&utm_medium=referral 在阅读这篇文章以前,首先须要理解几个东西:java
一、什么是Android的冷启动时间? 冷启动时间是指用户从手机桌面点击APP的那一刻起到启动页面的Activity调用onCreate()方法之间的这个时间段。android
二、在冷启动的时间段内发生了什么? 首先咱们要知道当打开一个Activity的时候发生了什么,在一个Activity打开时,若是该Activity所属的Application尚未启动,那么系统会为这个Activity建立一个进程(每建立一个进程都会调用一次Application,因此Application的onCreate()方法可能会被调用屡次),在进程的建立和初始化中,势必会消耗一些时间,在这个时间里,WindowManager会先加载APP里的主题样式里的窗口背景(windowBackground)做为预览元素,而后才去真正的加载布局,若是这个时间过长,而默认的背景又是黑色或者白色,这样会给用户形成一种错觉,这个APP很卡,很不流畅,天然也影响了用户体验。数据库
3.看一下效果之间的对比:图1、这是未优化 图2、方案一优化后 图3、方案二优化后 微信
2、消除启动时的白屏/黑屏 在用户点击手机桌面APP的时候,看到的黑屏或者白屏实际上是界面渲染前的第一帧,若是你看懂了文章头的那2个问题,那么解决这个问题就很是轻松了,无非就是将Theme里的windowBackground设置成咱们想要让用户看到的画面就能够了,这里有2种作法:app
一、将背景图设置成咱们APP的Logo图,做为APP启动的引导,如今市面上大部分的APP也是这么作的。ide
<style name="AppWelcome" parent="AppTheme"> <item name="android:windowBackground">@mipmap/bg_welcome_start</item> </style>
二、将背景颜色设置为透明色,这样当用户点击桌面APP图片的时候,并不会"当即"进入APP,并且在桌面上停留一会,其实这时候APP已是启动的了,只是咱们心机的把Theme里的windowBackground的颜色设置成透明的,强行把锅甩给了手机应用厂商(手机反应太慢了啦,哈哈),其实如今微信也是这样作的,不信你能够试试。布局
<style name="Appwelcome" parent="android:Theme.Translucent.NoTitleBar.Fullscreen"/>
透明化这种作法须要注意的一点,若是直接把Theme引入Activity,在运行的时候可能会出现以下异常:优化
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
这个是由于使用了不兼容的Theme,例如我这里的Activity继承了AppCompatActivity,解决方案很简单: 一、让其Activity集成Activity而不要集成兼容性的AppCompatActivity 二、在onCreate()方法里的super.onCreate(savedInstanceState)以前设置咱们原来APP的Themeui
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); } }
上面的2种作法,咱们都须要将Theme引入对应的Activitythis
<activity android:name=".app.main.MainActivity" android:theme="@style/AppWelcome" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
3、关于启动优化
上面的作法其实能够达到"秒开"APP的效果,不过确不是真实的速度,在Activity建立过程当中实际上是会通过一系列framework层的操做,在平常开发中,咱们都会去重写Application类,而后在Application里进行一些初始化操做,好比存放用户标识的静态化TOKEN,第三方SDK的初始化等。 这里给出几点建议: