记录一次安卓应用启动白屏的解决过程,遇到的style。刚开始学习安卓开发,有不对的请指正。
1. 启动白屏
安卓应用启动时候会先白屏一两秒,才看到MainActivity的画面,这个体验还是很差的。这里面涉及一个冷启动的概念。
冷启动指的是应用程序从头开始:系统的进程没有,直到此开始,创建了应用程序的进程。 在应用程序自设备启动以来第一次启动或系统杀死应用程序等情况下会发生冷启动。 这种类型的启动在最小化启动时间方面是最大的挑战,因为系统和应用程序比其他启动状态具有更多的工作。
冷启动只是白屏的其中一个原因,也就是这时候应用的一系列初始化会拉长第一个画面显示出来的时间。所以,这里面优化的方向,是在Application、MainActivity中的Oncreate方法中的初始化尽量少,在首个页面做一个loading,启动后台线程做一些初始化,然后再通知主线程退出loading。
但这只是减少白屏时间。那就有另一个概念,主题theme。
2. 安卓主题theme
Theme主要是针对应用级别的或者说窗体级别,可以设置应用主题(应用换肤效果)和Activity的主题;主题是不能应用在某一个单独的View中;或者说Theme是用来设置应用全局主题风格的,对整个应用或某个Activity存在影响。我们在manifest.xml中的Application标签/或者某个Activity标签下设置
android:theme="@style/AppTheme"
可以看到主题是引用style资源。
3. Style资源
style其实就定义了UI的格式和外观,类似C语言的#define。如下,定义一个CustomFontStyle类型,这个类型定义了一系列的UI布局、文字颜色、大小、框高等,这样在其他布局文件中直接引用CustomFontStyle,就可以一行解决了这一系列UI定义。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomFontStyle">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:capitalize">characters</item>
<item name="android:typeface">monospace</item>
<item name="android:textSize">12pt</item>
<item name="android:textColor">#00FF00</item>/>
</style>
</resources>
在其他布局文件中的view可以通过style="@style/CustomFontStyle"即可引用。
可以看到其实,我们定义的是一个style,而主题也是引用style。但是主题又只能在Application和Activity中用,不能再view使用,但是style又能再view使用,那不就是哪都能用style吗?
从Theme和style的作用范围可以看出他们的区别;如果一个应用使用了theme,同时应用下的view也使用了style,那么当theme与样式style发生冲突时,style有效,因为style的优先级高于theme;在R.attr定义中以window开头的一些属性只对theme有效。
4.解决白屏
安卓启动的窗体主题,通过style定一个图片或者背景色,这样应用启动时候就会先显示这个图片、背景色,从而看不到白屏了。这个图片和背景色最好和首页activity有一定的相关风格,这样画面变化不会显得太突兀。
最后补充一个知识点,Activities如果继承自 AppCompatActivity ,则它的 setContent 会自动应用 AppCompat 主题,而Activity则不会,我刚好就是继承Activity。所以有些同学可能感觉遇不到这个问题。
参考
https://blog.csdn.net/sinat_35214775/article/details/120955056https://blog.csdn.net/sinat_35214775/article/details/120955056
相关网络资源,如有侵权,联系删除。