Android冷启动-实现APP秒开
我们第一次打开 APP 的时候,如果没有做过处理,会经历一段白屏的时间,然后再开始看到我们的主页面;
如下图所示:
白屏的时间根据手机硬件配置来决定,一般在 500 - 2000 毫秒之间。
什么是冷启动?
冷启动就是,当 APP 进程被杀死,第一次打开该 APP 启动,它的启动过程就是冷启动。
冷启动的缺点是什么?
在没有做任何处理的情况下,当我们打开 APP ,屏幕出现白屏\黑屏;这便是冷启动的缺点。
产生白屏的原因或冷启动的原因是什么?
APP 的启动流程:
点击图标 ==> 启动应用 ==> 创建窗口(白屏或黑屏) ==> 创建进程 ==>
初始化 Application ==>启动线程 ==> 创建 activity ==> 创建布局 ==> 页面显示;
这样就可以发现,APP 的启动是需要时间的,也是无法避免的。
优化白屏或冷启动的方案
通过 Android 提供的 android:windowBackground 方法。优化的方法目前有且只有这一个。
我们可以通过 android:windowBackground 延伸出多种方案。
方法一
首先提供一个国外最常用方法,使用纯色背景图和图标。
如果你玩过 Twitter、YouTube 或 Reddit 国外软件,就可以发现,它们的启动图如下面所示:
非常的单调,但是直接解决启动白屏的问题。
下面我也跟它们做的一样,纯色背景 + 图标启动 APP。
首先在 drawable 文件夹下面新建名称为 bg_start 的 xml 文件,里面的代码如下面所示:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/colorPrimary" />
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher" />
</item>
</layer-list>
创建 SplashActivity ,设置为启动的 activity ,由它跳转到 MainActivity,里面的代码为:
/**
* wuqingsen on 2019-11-20
* Mailbox:aaa@qq.com
* annotation:
*/
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
}
}
在 styles 中,应用 bg_start ,代码如下:
<!--app秒开-->
<style name="SplashThemeLayer" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowBackground">@drawable/bg_start</item>
</style>
最后在 AndroidManifest.xml 文件中添加下面的代码即可:
<activity android:name=".SplashActivity"
android:theme="@style/SplashThemeLayer">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
运行起来,如下图所示:
可以看到,APP 没有了白屏,运行也很流畅。
方法二
上面的方法虽然好,但是在国内没有多少 APP 这么使用,启动图总是广告。而你只能屈服,并且来优化这个问题。
下面给出方法二,添加图片,这个方法在国内的 APP 使用还是有的。
添加图片的方法非常的简单,只需要修改 styles 的代码,如下图所示:
<!--app秒开-->
<style name="SplashThemeLayer" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowBackground">@drawable/start</item>
<item name="android:windowTranslucentStatus" tools:ignore="NewApi">true</item>
</style>
添加完毕,运行效果如下:
运行流畅,没有白屏的情况。
如果还是无法满足你的需求,就从下面去找属于你的方法:
https://github.com/saulmm/onboarding-examples-android
源码比较简单,这里就不再给出了。
说完冷启动,那么就一定有热启动了;
啥是热启动?
热启动就是进程存在的情况下,再次打开 APP。
如:按下 home 键,再次回到 APP ;或者进入其它 APP ,再回来;等等
由于 Application 还在,所以无需走 APP 的启动流程,所以也不再多说了。
结束。