前言
问题:在App启动过程中会出现闪白屏或黑屏的一段时间才进入布局界面。
首先来了解一下
冷启动
该App之前没有被系统加载到VM虚拟机,且未缓存此App数据,并且后台无该App线程,启动App称为:令启动
热启动
App启动后,按back键退出程序,此时App线程还缓存在后台,启动App后Application因为已经缓存,所以直接进入Activity。称为:热启动
问题之源
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时,Activity中onCreate()-->setContentView()并不会马上加载布局,而是先初始化绘制Application window窗体,这个时候布局还没加载,使用的是默认背景色,其次才执行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>
在代码中
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
}
catch (InterruptedException e)
{}
startActivity(new Intent(MainActivity.this, A.class));
finish();
}
}).start();