App启动页面优化
目录介绍
-
01.存在白屏问题
- 1.1 问题描述
- 1.2 问题分析
-
02.解决白屏的办法
- 2.1 解决方案分析
- 2.2 第一种解决方案
- 2.3 第二种解决方案
- 2.4 注意要点
- 03.Application启动速度优化
- 04.启动页面屏蔽返回按键
好消息
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计50篇[近30万字],转载请注明出处,谢谢!
- 链接地址:https://github.com/yangchong211/YCBlogs
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!
- 轮播图封装库:https://github.com/yangchong211/YCBanner
- 轻量级版本更新弹窗:https://github.com/yangchong211/YCUpdateApp
- 通知栏封装库:https://github.com/yangchong211/YCNotification
01.存在白屏问题
1.1 问题描述
-
出现问题描述
- android app启动页面黑屏的问题,android开发app启动时若没有做特殊处理的话,会出现一瞬间的白屏现象。
- 即使你启动页界面就加载一个布局,不做其他耗时处理,貌似也会出现一瞬间的白屏问题。注意,有些地方也称黑屏,主要是看你给app设置的style样式。
- 当从桌面 Launcher 的小图标点击冷启动一个 App 的时候,程序需要进行一些基本的初始化操作,例如在Application 或者SplashActivity中做了很多耗时操作,例如初始化第三方SDK等,当手机性能不好,配置不高时,该现象尤其明显。
1.2 问题分析
-
为什么存在这个问题
- 当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态,于是系统根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。
- 实际上就是是activity默认的主题中的android:windowBackground为白色或者黑色导致的。
- 总结来说启动顺序就是:app启动——Preview Window(也称为预览窗口)——启动页
02.解决白屏的办法
2.1 解决方案分析
- Android在选择展示黑屏或者白屏的时候,是根据你设定的主题而不同的,也就是说,虽然你的代码没有被执行,你的配置文件却被提前读取了,用来作为展示Preview Window界面的依据。所以,解决方案的切入口就是整个APP的manifest文件,更确切的说应该是主题配置文件。
- 设置配置文件style样式中的windowBackground这个属性来显示一张背景图还有一个效果就是启动应用程序会感觉非常快,而且与加载MainActivity的contentView是异步的。
2.2 第一种解决方案
-
解决办法:给当前启动页添加一个有背景的style样式
- 设置style样式如下
<style name="SplashTheme" parent="AppTheme"> <item name="android:windowBackground">@mipmap/splash</item> <item name="android:statusBarColor" tools:ignore="NewApi">@color/white</item> <item name="android:windowIsTranslucent">true</item> </style>
- 注意,在清单文件中
<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>
-
经过处理之后App启动时就不会出现一瞬间白屏的效果
- 将主题设置到启动的Activity的主题中,windowBackground就是即将展示的preview window。其中splash可以是一整张图片,它也可以是一个能解析出图片资源的XML文件。
-
该方案注意要点
- 给Preview Window设置的背景图如果不做处理,图片就会一直存在于内存中,所以,当我们进入到欢迎页的时候,不要忘了把背景图设置为空
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { //将window的背景图设置为空 getWindow().setBackgroundDrawable(null); super.onCreate(savedInstanceState); }
-
这样操作如何屏幕适配呢?
- 这样通过样式style设置SplashActivity加载图,不能像imageView那样可以设置缩放功能,因此可以采用.9图片。
- 以前有开发者采用我的这个建议,直接设置图,没有做适配,也无伤大雅,具体要看UI要求呢!
2.3 第二种解决方案
-
禁止加载Preview Window,具体做法如下:
<style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowDisablePreview">true</item> </style>
- 设定为启动的Activity的主题,即可禁止Preview Window,当然,也有人通过把preview window设置为全透明,也达成了类似的效果。个人感觉这种方法没有第一种好!
-
windowDisablePreview的作用
- 通过设置android:windowDisablePreview属性,禁用窗口的预览动画,在SplashActivity显示之前,系统永远不会使用窗口的主题来显示它的预览,这也保证了不会出现白屏或者黑屏。但是,与设置android:windowIsTranslucent属性一样,如果在SplashActivity启动的时候,有过多复杂的操作,就会出现在手机中点击了应用程序的图标,但过n秒才会打开应用程序不好的卡顿体验效果。
-
该方案是否有缺点?
- 这种方法有个小缺点,就是点击后短暂的那几百毫秒没有反应,就好像“假死”了一样,过了一会儿才跳出我们应用程序的第一个Activity,如果你不想让你的 App 有这个短暂“假死”时间,建议使用第一种方法。
2.4 注意要点
- 不管是那种方式,都可以解决问题。注意的是有些手机标题栏和状态栏也会影响这两图层的,造成抖动效果,为了避免这种情况需要处理状态栏问题。这里可以直接引用我封装的状态栏库,有兴趣可以了解下,直接拿来用:https://github.com/yangchong211/YCStatusBar
03.Application启动速度优化
-
提高app的启动速度,加快Application的执行时间也是一个很重要的方面,这里我暂时总结了几条原则:
- 尽量不将一些业务逻辑放于Application中;
- Application尽量不以静态变量的方式保存应用数据;
- 若App的大小不是特别大无需使用dex分包方案;
- 在Application中关于文件,数据库等耗时的操作尽量放到IntentService线程中处理
- 不要做有关于循环的操作
04.启动页面屏蔽返回按键
-
一般App中都会在启动页面执行一些初始化配置等,所以这时候启动页加载时不希望用户通过按下返回按键退出App,因而可以在启动页中屏蔽返回按键,这里简单的介绍一下具体的实现:
/** * Activity屏蔽物理返回按钮 * * @param keyCode * @param event * @return */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return super.onKeyDown(keyCode, event); }
关于其他内容介绍
01.关于博客汇总链接
02.关于我的博客
- 我的个人站点:www.yczbj.org,www.ycbjie.cn
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yczbj/activities
- 简书:http://www.jianshu.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/
- 开源中国:https://my.oschina.net/zbj1618/blog
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 邮箱:yangchong211@163.com
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 中使用 dlib+opencv 实现动态人脸检测
1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo。该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用矩形框描绘出来。具体实现原理如下: 采用双层 View,底层的 TextureView 用于预览,程序从 TextureView 中获取预览帧数据,然后调用 dlib 库对帧数据进行处理,最后将检测结果绘制在顶层的 SurfaceView 中。 2 项目配置 由于项目中用到了 dlib 与 opencv 库,因此需要对其进行配置。主要涉及到以下几个方面: 2.1 C++支持 在项目创建过程中依次选择 Include C++ Support、C++11、Exceptions Support ( -fexceptions )以及 Runtime Type Information Support ( -frtti ) 。最后生成的 build.gradle 文件如下: defaultConfig { applicationId "com.example.lightweh.facedetectio...
- 下一篇
让旧手机运行 Android O? 看看 Android Go 是如何做到的
Android Go 是谷歌基于 Android 8.1 Oreo 的精简版 Android 系统,是成为针对 1GB 或更低内存的低端设备的 Android 优化版。Android Go 是为下一代入门级设备开发的,为的是确保发展中国家的消费者仍然可以使用功能正常的智能手机来访问互联网并使用应用程序。 Android Go 拥有各种性能优化和改进,比如其内存占用比普通 Android O 少一半,设备平均运行速度比在同一设备上安装常规的 Android O 快 15%。这些优化是通过谷歌制作的一些专门的构建配置完成的,将在后面进行解释。 Android Go 还益于特殊的 “Go” 系列应用程序,比如 Files Go,YouTube Go 和 Google Maps Go。这些是由谷歌制作的轻量级版应用,不那么吃配置。这意味着那些使用 Android Go 设备的用户可以拥有标准的 Android 系统体验,开心地使用谷歌全家桶,无需购买昂贵的旗舰手机。 这关乎谷歌扩大智能机市场的计划。但是开发者们可能会有疑问,如果 Android Go 主要基于构建配置和一套优化过的谷歌应用组成...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS关闭SELinux安全模块