当前位置: 首页 > news >正文

Android 项目优化(二):启动页面优化

一、启动页黑屏的问题

1.1 问题现象描述

Android App 启动页面黑屏的问题,现象表现为:Android 开发 App 启动时若没有做特殊处理的话,会出现一瞬间的白屏现象。即使启动页界面就加载一个布局,不做其他耗时处理,貌似也会出现一瞬间的白屏问题。当从桌面 Launcher 的小图标点击冷启动一个 App 的时候,程序需要进行一些基本的初始化操作,例如在Application 或者SplashActivity中做了很多耗时操作,例如初始化第三方SDK等,当手机性能不好,配置不高时,该现象尤其明显。

注意,有些地方也称黑屏,主要是看给 App 设置的 Style 样式。

二、启动页黑屏问题分析

1.2 问题分析

为什么存在这个问题?主要在于以下几点:

1. 当系统启动一个 App 时,zygote进程会首先创建一个新的进程去运行这个 App,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态,于是系统根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。

2. 此问题的现象实际上就是是Activity默认的主题中的android:windowBackground为白色或者黑色导致的。

3. 启动顺序总结实际为:App启动——Preview Window(也称为预览窗口)——启动页。

1.3 解决黑屏问题

Android 在选择展示黑屏或者白屏的时候,是根据你设定的主题而不同的,也就是说,虽然你的代码没有被执行,你的配置文件却被提前读取了,用来作为展示Preview Window界面的依据。所以,解决方案的切入口就是整个APP的manifest文件,更确切的说应该是主题配置文件。

设置配置文件style样式中的windowBackground这个属性来显示一张背景图还有一个效果就是启动应用程序会感觉非常快,而且与加载MainActivity的contentView是异步的。

第一种解决方案

解决办法:给当前启动页添加一个有背景的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图片。

第二种解决方案

禁止加载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。

 

转载于:https://www.cnblogs.com/renhui/p/11027248.html

相关文章:

  • 微信小程序常用样式汇总
  • 虚拟机导入虚拟电脑 环境变量丢失
  • mysql优化:覆盖索引(延迟关联)
  • 编译原理--02 自顶向下、自底向上的LR分析复习(清华大学出版社第3版)
  • webservice服务器借用cxf工具开发
  • 软件测试2019:第八次作业—— 缺陷管理(含缺陷管理工具的配置实验)
  • 实验6 流类库与I/O
  • Python day 44 :数据库的存储引擎/索引/权限管理
  • vsphere6.7-虚拟机与ESXI时间同步
  • 结合案例深入解析迭代器模式
  • laravel5.5入门-安装和认证
  • 没事干 回忆下快排
  • 并发
  • 微信-小程序-开发文档-服务端-模板消息:templateMessage.deleteTemplate
  • SmartGit 合并分支,图文
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 30秒的PHP代码片段(1)数组 - Array
  • Java,console输出实时的转向GUI textbox
  • JavaScript HTML DOM
  • Joomla 2.x, 3.x useful code cheatsheet
  • React16时代,该用什么姿势写 React ?
  • session共享问题解决方案
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue 动态创建 component
  • 配置 PM2 实现代码自动发布
  • 普通函数和构造函数的区别
  • 前端性能优化--懒加载和预加载
  • 我这样减少了26.5M Java内存!
  • 用Canvas画一棵二叉树
  • 在Unity中实现一个简单的消息管理器
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 达梦数据库知识点
  • #、%和$符号在OGNL表达式中经常出现
  • (003)SlickEdit Unity的补全
  • (2)nginx 安装、启停
  • (2.2w字)前端单元测试之Jest详解篇
  • (2015)JS ES6 必知的十个 特性
  • (ibm)Java 语言的 XPath API
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (待修改)PyG安装步骤
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (一)Linux+Windows下安装ffmpeg
  • (转)c++ std::pair 与 std::make
  • (转)Sublime Text3配置Lua运行环境
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 依赖注入的基本用发
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 使用反射注册事件
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .netcore如何运行环境安装到Linux服务器
  • .NET成年了,然后呢?
  • /proc/vmstat 详解