在项目中有没有觉得自己App启动慢,第一次启动的时候会有0.5s的白屏,项目经理有没有提出这个细节呢?或许你没有注意,或许你已经解决了,但是App冷启动都是绕不开的话题。
为什么 APP 启动时会出现白屏或者黑屏?
当打开一个 Activity 时,如果这个 Activity 所属的应用还没有在运行,系统会为这个 Activity 所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果没有任何反应的话,如果程序初始化的时间很长,用户可能还以为没有点到相应的位置。但此时所启动的程序还没初始化完,既无法显示程序,又不能停在原处不做任何动作,怎么办?这就有了Starting Window的概念,也可以称之为Preview Window。
Starting Window 就是一个用于在应用程序进程创建并初始化成功前显示的临时窗口。在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并做出了响应,当程序初始化完成后显示用户 UI 并移除这个窗口。
显示白屏或者黑屏,是由你的启动 Activity 或者 Application 来决定的。如果你使用的是 Light 主题,那么就可能出现白屏;如果你使用的是 Black 主题,那么就可能出现黑屏。当你设置 Light 或者 Black 主题时,Starting Window 显示的就是你启动 Activity 的 android:windowBackground 属性,所以才会出现白屏或者黑屏的情况。
解决方案:
1.让窗口透明,启动的时候就看不到白色窗口了。
2.给窗口加上背景,一进来就显示出来啊,那白屏不就解决了吗?
先学会常用的Theme主题功能:
Activity显示为对话框模式
android:theme="@android:style/Theme.Dialog"
不显示应用程序标题栏
android:theme="@android:style/Theme.NoTitleBar"
不显示应用程序标题栏,并全屏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
背景为白色
android:theme="Theme.Light "
白色背景并无标题栏
android:theme="Theme.Light.NoTitleBar"
白色背景,无标题栏,全屏
android:theme="Theme.Light.NoTitleBar.Fullscreen"
背景黑色
android:theme="Theme.Black"
黑色背景并无标题栏
android:theme="Theme.Black.NoTitleBar"
黑色背景,无标题栏,全屏
android:theme="Theme.Black.NoTitleBar.Fullscreen"
用系统桌面为应用程序背景
android:theme="Theme.Wallpaper"
用系统桌面为应用程序背景,且无标题栏
android:theme="Theme.Wallpaper.NoTitleBar"
用系统桌面为应用程序背景,无标题栏,全屏
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"
透明背景
android:theme="Theme.Translucent"
透明背景并无标题
android:theme="Theme.Translucent.NoTitleBar"
透明背景并无标题,全屏
android:theme="Theme.Translucent.NoTitleBar.Fullscreen"
面板风格显示
android:theme="Theme.Panel "
1.窗口透明做法:将该主题设置到启动activity。 使用<item name="android:windowBackground">@android:color/transparent</item>设置背景为透明。
<style name="TransluteTheme" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:screenOrientation">portrait</item>
</style>
透明方法效果图:可以看出,点击启动图标之后,虽然立即启动了,但是窗口透明,没有白屏,但是缺点就是启动速度慢,没有达到秒速启动的效果。
2.伪布局做法(主流做法):将该主题设置到启动activity。 使用<item name="android:windowBackground">@mipmap/splashbg</item>设置默认图片为splashbg。
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowBackground">@mipmap/splashbg</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
默认背景图:点击启动图标立即加载窗口,立即显示背景图,达到秒速启动效果。(ps:这张图是我临时做的一张,不满效果,不要打我)
Application启动优化如何做?
我们可以将application中的初始化放在一个单独的线程中处理, 为了方便今后管理, 这里我用了一个IntentService来做初始化工作,service是运行在主线程中,而intentService运行在后台线程中,在application中启动intentservice。或者开启协程切换到子线程进行初始化操作。
好了,功能实现了。喜欢我就点我吧,博客持续更新中,最实用的项目功能就在其中。