前言
问题:在App启动过程中会出现闪白屏或黑屏的一段时间才进入布局界面。这样的体验十分不好。
首先来了解一下
冷启动
当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
热启动
当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。
问题之源
Application 或 Activity 的Theme比如使用了以下 Theme:
<style name="AppTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- 令启动App时,出现闪白屏-->
</style>
<style name="AppTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- 令启动App时,出现闪黑屏-->
</style>
原因:当启动App时,此时后台无改App线程的缓存,就会分配一个新线程给这个应用,并创建初始化Application类,
系统会在加载初始化布局之前(Activity 中 onCreate()-->setContentView()
),首先会初始化窗口Window,而Window顶层是一个DecorView,此时的背景属性设置就是由Theme设置的值(没有则默认值),其次才执行setContentView()。所以就出现了闪白或黑屏的现象。
解决方案
此方案是 main入口启动 SplashActivity 启动页 ,在onCreate() 方法中新建线程延迟时间启动 MainActivity。
核心代码 系统背景属性:
<item name="android:windowBackground">@drawable/image</item>
定义style:
<style name="SplashTheme" parent="AppTheme">
<!--设置背景图片-->
<item name="android:windowBackground">@drawable/image</item>
</style>
在AndroidManifest中引用
<activity android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在SplashActivity onCreate()代码中
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
}
catch (InterruptedException e)
{}
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}).start();