APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,这可能会让用户会以为没有点到APP而再次点击,极大的降低了用户体验,Android需要及时做出反馈去避免这段时间的尴尬。于是系统会根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。这个黑(白)屏就称为Preview Window,即预览窗口。
安卓启动方式一般有3种:
>Coldstart——冷启动:
此种方式最为耗时,一般是因为进程被干掉或者是第一次启动app,系统需要重新fork进程进行一系列初始化,后台没有该应用的进程。
>WarmStart ——暖启动
比ColdStart稍快,当app的Activities被销毁,但还在内存中常驻时启动方式会变为暖启动,app并没有被杀掉,所做的只是把app从后台提到前台来展示,并不需要重走初始化一系列行为,减少了对象初始化、布局加载等工作。但其表现行为与冷启动一致,还是会先显示一个Preview Window(黑白屏)直到app渲染activity。
如果由于响应了低内存事件,例如在onTrimMemory()方法中清除了资源对象,那么这些对象就需要在热启动时重新创建。
>LukeWarm Start——热启动
启动方式最快,比暖启动开销小,类似于按返回键back、home键退出应用又立即进入的那种行为,后台已有该应用的进程。
接下来看看如何优化冷启动:
既然我们已经找到这个黑白屏是出自系统的预览窗口,我们就可以通过操控这个窗口来实现。这个预览窗口是在activity启动页前显示的一个安卓优化措施,我们可以从主题中可以找到,是可以设置这个窗口配置的。
1.更改窗口的颜色背景
2.设置窗口全屏显示
在Manifest文件中的启动页activity添加自定义的主题android:theme="@style/SplashTheme"
接下来看看style的属性配置,注意父主题使用parent="@android:style/Theme.Light.NoTitleBar.Fullscreen"最佳
以上name="android:windowBackground”背景你可以设置多种,如果是设置为透明要将<item name="android:windowIsTranslucent">true</item>设置为true,当点击运行app后是透明背景的,给人的一种系统响应慢的错觉,完美甩锅。若是设置一张图片,也要设置<item name="android:windowIsTranslucent">false</item>,即可实现秒开闪屏效果。而我这里是在drawable中新建splashx_bg.xml使用bitmap位图设置的背景图,能够对图片做更多的设置操作。
最后注意:Preview Window设置的背景图如果不做处理,图片就会一直存在于内存中,所以,当我们进入到欢迎页的时候可不要忘了把背景图设置为空
透明背景:
透明背景位图bitmap加载:
位图bitmap直接设置图片:
图片
2018/11/2最后补充一下需要注意:在Android 8.0即api26,谷歌对于AndroidManifest.xml中设置了锁定屏幕android:screenOrientation="portrait"的透明activity会报以下错误“Only fullscreen opaque activities can request orientation”,经测试不管是否全屏都如此,在8.1后谷歌修复了这个bug,解决方法我个人是去掉锁定屏幕设置或者将theme中的透明背景设为不透明。参考传送门
网友评论