Splash界面的秒开

借鉴: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的初始化等。 这里给出几点建议:

  1. 不要让Application参与业务的操做
  2. 不要在APPlication进行耗时操做,好比有些开发者会在本身的APP里一系列文件夹或文件(好比我本身),这些I/O操做应该放到"确实该使用的时候再去建立"亦或者是数据库的一些操做。
  3. 不要以静态变量的方式在Application中保存数据等。
相关文章
相关标签/搜索