阅读须知

1、冷启动时间

Android的冷启动时间其实就是从用户点击APP的那个时间,到入口第一个Activity调用结束onCreate()方法之间的这个时间段。

2、冷启动期间发生了什么

我们都知道,一个应用APP的开启,首先手机会为一个未打开的应用开辟一块内存,然后初始化Application(每创建一个进程都会调用一次Application,所以Application中的onCreate()是可能会被多次调用的),然后因为manifast文件设置,看到入口的第一个Activity界面。创建进程和初始化的过程中,一直到第一个Activity未见面的这个阶段,肯定会耗时一段时间,时长也肯定是根据手机性能而异,WindowManager会先去加载Application的主题样式里面的窗口背景作为预览元素,也就是WindowBackground,然后才去加载布局,不管这个时间长还是短,都会看到或白或黑的全屏背景,给用户很差的用户体验。

解决方案1

既然这个问题如果不处理,很容易就会有不好的用户体验,那么我们来看看,大名鼎鼎的微信是如何来做的。读到这里的小伙伴,请拿起手中的手机,点击微信试试。你会发现,它似乎楞了几秒,然后进入到了主界面。

将背景颜色设置为透明色,这样当用户点击桌面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,解决方案很简单:
1、让其Activity集成Activity而不要集成兼容性的AppCompatActivity
2、在onCreate()方法里的super.onCreate(savedInstanceState)之前设置我们原来APP的Theme

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            setTheme(R.style.AppTheme);
            super.onCreate(savedInstanceState);
    }
}

解决方案2

我们在写安卓项目的时候,大多数习惯准备一个Splash的闪屏页,很多同学说,这个页面就是为了搞掉那个白屏或者黑屏的,但是为什么不生效。原理也是和上述是一样的,背景图优先,然后才是真正的布局文件,所以,只要把背景图设置成我们自定义的图片就好了

<style name="AppWelcome" parent="AppTheme">
        ...
        <item name="android:windowBackground">@mipmap/start_bg</item>
</style>

最后把这个特别的theme扔给Splash这个页面

<activity
            android:name=".ui.splash.SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppWelcome">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

特别注意,操作到这里并不是结束了,因为如果不处理这个style,默认后面背景会全都是图片。别忘了在BaseActivity里面,和透明化的操作的情况相同,将正常的style引入,否则,你懂得。