目录介绍

  • 01.存在白屏问题

    • 1.1 问题描述
    • 1.2 问题分析
  • 02.解决白屏的办法
    • 2.1 解决方案分析
    • 2.2 第一种解决方案
    • 2.3 第二种解决方案
    • 2.4 注意要点
  • 03.Application启动速度优化
  • 04.启动页面屏蔽返回按键

好消息

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.关于我的博客

App启动页面优化的更多相关文章

  1. 添加App启动页面

    记录下自己在设置app启动页面时遇到的问题. 先写下自己完整的步骤吧. iPhone Portrait iOS 8-Retina HD 5.5 (1242×2208) @3xiPhone Portra ...

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

    一.启动页黑屏的问题 1.1 问题现象描述 Android App 启动页面黑屏的问题,现象表现为:Android 开发 App 启动时若没有做特殊处理的话,会出现一瞬间的白屏现象.即使启动页界面就加 ...

  3. iOS App 启动性能优化

    1. App启动过程 解析Info.plist 加载相关信息,例如如闪屏 沙箱建立.权限检查 Mach-O加载 如果是胖二进制文件,寻找合适当前CPU类别的部分 加载所有依赖的Mach-O文件(递归调 ...

  4. 一触即发 App启动优化最佳实践

    一触即发 App启动优化最佳实践 本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送. 文中的很多图都是Google性能优 ...

  5. 【Xamarin.Forms 2】App基础知识与App启动

    系列目录 1.[Xamarin.Forms 1]App的创建与运行 引言 本篇文章将介绍Xamarin.Forms中 App 基础知识和 App的启动. 开发环境 Visual Studio 2019 ...

  6. 高德APP启动耗时剖析与优化实践(iOS篇)

    前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为用户省下的时间,还 ...

  7. 为什么很多APP要有启动页面

    我们启动APP时,一般都会是一张含有LOGO的图片.这张图片叫做启动页面. 这个启动页面是必须.一定需要的吗?有什么作用?   这是苹果官方对于iOS启动页的设计说明:   为了增强应用程序启动时的用 ...

  8. [FMX] Android APP 启动黑屏优化补丁

    使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 201 ...

  9. 使用ViewPagerAdapter 页面引导适配器设置app启动页,引导页面的实现

    一般的app第一次安装启动的时候,都会有一个启动页面和引导页的画面,然后才进入主程序.anndroid中的ViewPagerAdapter 是一个继承与PageAdapter的 页面引导适配器.由于我 ...

  10. Android性能优化-App启动优化

    原文地址:https://developer.android.com/topic/performance/launch-time.html#common 通常用户期望app响应和加载速度越快越好.一个 ...

随机推荐

  1. MyBatis动态sql之foreach标签 构建 in 语句

    <foreach> 元素主要用在构建 in 条件中,它可以在 SQL 语句中迭代一个集合.<foreach> 元素的属性主要有 item.index.collection.op ...

  2. .NET 大数据实时计算--学习笔记

    摘要 纯 .Net 自研大数据实时计算平台,在中通快递服务数百亿包裹,处理数据万亿计!将分享大数据如何落地以及设计思路,技术重难点. 目录 背景介绍 计算平台架构 项目实战 背景介绍 计算平台架构 分 ...

  3. 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I

    [LGR-148-Div.3]洛谷基础赛 #1 & MGOI Round I T1 luoguP9502 『MGOI』Simple Round I | A. 魔法数字 \(100pts\) 水 ...

  4. 详解instanceof底层原理,从零手写一个instanceof

    壹 ❀ 引 本道题的核心考点还是对于javascript原型的掌握程度,比如__proto__,prototype相关概念,以及instanceof底层原理的理解.若你对于原型已经非常熟悉,那么可以直 ...

  5. 建立DNS隧道绕过校园网认证

    建立DNS隧道绕过校园网认证 因为之前在本科的时候破解过校园网三次,主要就是利用其业务逻辑上的漏洞.53端口未过滤包.重放攻击的手段,然后就是一个博弈的过程,这三次加起来用了大概有一年的时间就被完全堵 ...

  6. Swoole从入门到入土(22)——多进程[Process]

    Swoole中的Process模块比原生php提供的pcntl模块,提供了更易用的多进程编程接口. 简单总结,Process模块有如下特点: · 可以方便的实现进程间通讯· 支持重定向标准输入和输出, ...

  7. mysqlGTID主从同步出现1236错误问题

    从主库xtrabackup备份,配置好gtid复制,从主库的从库复制.一直报错误 Last_IO_Error: Got fatal error 1236 from master when readin ...

  8. Spring boot内嵌tomcat日志配置

    1.说明 最近项目启动有问题需要打印更详细的tomcat日志来做分析,所以用一下. 主要涉及到两类日志配置: access log tomcat log access log捕捉http请求 tomc ...

  9. Jsp+Servlet实现文件上传下载(一)--文件上传

    文件上传和下载功能是Java Web必备技能,很实用. 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及 ...

  10. linux7/8版本的docker-ce安装(2022/5/27亲测可行)

    centos7 # 先配阿里源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl - ...