开发APP时候,如果不做任何处理,在用户打开应用时总会先出现黑屏或者白屏,之后才进入MainActivity中。这是加载程序时间过长造成的。具体的启动原理我就不再这里叙述了,可以百度一下,很多博客讲的都很清楚。我这里只说主要的部分。简单来说,从用户点击应用时,程序会执行Application的onCreate和Activity(入口Activity)的onCreate,之后才进行界面的展示。所以说呢,我们尽量要减少onCreate方法中程序的执行,能进行懒加载的要进行懒加载;可以放在子线程中执行的要放在子线程中。这样可以使白屏时间减少。但是现在应用需要接入大量的三方,而且都要求方法Application中的onCreate方法中,导致优化onCreate的方法的行为很少了。那应该怎么办呢?
现在很多应用当点击的时候都不会出现黑白屏,而是先出现一个自定义的页面,过了不定时长之后进入应用内。这个方法就是很好的解决办法。具体怎么实现呢?
一、APP启动优化
方法1
首先我们在style.xml文件中定义自己的主题,在android:windowBackgroud属性中写上替代白屏的图片。
<style name="AppTheme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/welcom_icon</item>
<item name="android:windowFullscreen">true</item>
</style>
给入口Activity设置刚刚定义的主题
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.MyTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
之后再在入口的Activity中的onCreate方法中设置原本的主题进行恢复
setTheme(R.style.AppTheme)
再次启动App之后就会方法,自己替换的图片代替了黑白屏。
方法2
先创建drawable文件,我们可以通过gravity设置位置,也可以通过item的bottom等属性设置margin距离
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="fill">
<bitmap android:gravity="fill" android:src="@drawable/splash_bac_white" />
</item>
<item android:bottom="@dimen/splash_bottom_margin">
<bitmap
android:gravity="center"
android:src="@mipmap/splash_top"/>
</item>
<item>
<bitmap
android:gravity="bottom"
android:src="@mipmap/splash_bottom"/>
</item>
</layer-list>
这里有个地方需要注意,那就是bitmap中图片的尺寸及位置。让UI切图的时候,图片的宽度一定要是720或者1080的尺寸(个人建议720),720的图片要放在mipmap-xhdpi文件夹;1080的图片要放在mipmap-xxhdpi文件夹。
在style中的windowBackground中设置drawable
<style name="AppTheme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/my_drawable</item>
<item name="android:windowFullscreen">true</item>
</style>
之后的操作和方法1是一样的,现在清单文件中设置theme,然后再onCreate方法中进行恢复。
方法3
还有两种方式也可以替代黑白屏的显示,那就是不让黑白屏展示出来。以下代码在自定义的主题中添加,替代android:windowBackground
<item name="android:windowIsTranslucent">true</item>
或
<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>
如果应用开始的延迟时间过长的话,点击应用没有任何反应,等加载完成之后直接进入应用。不会有黑白屏,也没有自己的图片。其实就是让黑白屏透明。这两种方法第二种要比第一种的内存消耗要小一点,第一种只是隐藏了黑白屏,但是依然会在内存中加载,第二种则不会加载内存。我们需要知道,黑白屏其实是Android系统加载应用过程防止时间过长而展示的,如果我们采用第二种方法,相当于把这种优化取消了。
二、Trace的使用
trace是Android自带的调优工具。我们通过以下的写法,就可以计算出某代码块的执行时间
//参数:分析结果文件生成的路径,文件后缀为.trace
Debug.startMethodTracing(traceFile.getAbsolutePath());
....
伪代码
....
Debug.stopMethodTracing();
我们在手机中找到此文件,把它在AS中打开,如图
我们可以清楚的知道我们所监测代码块的执行时间,对耗时的方法或代码进行优化
当然我们每次写这样的两行代码不太方便,所以我们完全可以使用AOP的方法进行切面监测,一行注解就可以监测一个方法,很方便