App启动白屏黑屏优化_通用黑屏优化_Android-Yang的博客-程序员秘密

技术标签: 优化  Android  

App启动时黑白屏优化

     黑白屏问题是app需要重点优化点之一,我以前都是遇到这种比较典型的问题直接上网查找相关的解决方案,筛选直接用,这样的缺点是,只知其表,不知其里,感觉自己这块懂了,但是和人实际表述的时候却说的很片面。细致梳理一下,让自己认知更深刻一下。如果有理解不对的地方,请多多指点。在此先谢过!!

1 、app的启动流程图:


小结:从图中可以看出app启动分为俩个阶段,一个是系统进程层,一个是application进程层。修改系统层需要root权限,所以真正的优化其启动速速是在application进程中。这里只分析application进程。这个流程图就是冷启动的过程。

所谓冷启动:冷启动是指进程未被创建的时候,用户launcher点击图标启动app的过程。

热启动:用户点击back键,退到手机应用图标界面,这时候进程没有被杀死,在点击应用的图标启动应用。

分析一:在此过程中,系统要为app创建一个进程,并且这个过程还包含Activity的绘制过程,这些都是比较耗时的。针对以上因素,所以Android系统框架设计了一个startWindow窗口,在app的window窗口绘制完毕之前,系统会先让startWinow窗口显示,直到activity的window窗口初始化完毕。我们所说的黑白屏就是startWindow窗口,黑或白是我们窗口的背景颜色,而背景颜色是由主题的背景颜色决定。只要我们解决这个主题背景色的问题,这个问题也就解决了。

分析二:在大中型项目中,一般都是在application中初始化组件和集成的第三方sdk,其在初始化的时候会消耗大量的时间。这就导致我们app启动比较缓慢,造成黑白屏时间过长,用户体验差的效果。

2、原因我们已经找到,下面来分析一下解决方案:

从网上各种针对此问题的文章做了总结归纳:解决方案有以下几种:

①自定义一个主题,把主题窗口背景色设置为透明,在application中设置这个主题

②修改我们的主题背景图片,图片设置为我们app的logo,在application中引用这个主题

③优化application初始化所需要的时间(一般都是开启子线程,常用的是IntentService)

3、具体实施步骤

①设置透明主题:代码如下

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        ...
        
        <item name="android:windowIsTranslucent">true</item>
        
    </style>

此种方案特点:就是当我们点击应用图标的时候,会感觉反应不那么快,不熟悉的人以为自己没有打开成功,会连续点击。如果启动时间过长,那么用户体验比较差。

②给自定义主题设置背景图片,图片是我们的logo图片,现在市场很多app都是应用此方法。代码如下

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="android:windowBackground">@drawable/splash</item>

        <item name="windowActionBar">false</item>

        <item name="windowNoTitle">true</item> 

    </style>

注意点:在我们的splash页面onCreate方法中要添加下面一行代码:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

这行代码的作用:不显示系统标题栏,保证我们启动的windowbackground和我们布局文件显示的大小一样大,防止图片错位。

③优化我们application onCreate方法中耗时操作,常借助IntentService

IntentService:其本质是一个特殊的service,它是一个抽象类,并且是继承Service。它可以在后台执行耗时的异步任务,当任务完成后会自动停止,优先级比较高,不容易被杀死(原因:继承service),它内部是使用HandlerThread 和handler实现异步操作的,创建IntentService时只需要实现onHandlerIntent和构造方法即可。系统执行onHandlerIntent方法时候会帮我们创建一个子线程,并且在任务执行完毕后,自动调用stopService方法,停止服务,不需要我们终止。优化代码如下:

创建IntentService,代码如下:

import android.app.IntentService;
import android.content.Intent;
import android.content.Context;


public class MyIntentService extends IntentService {


    public MyIntentService() {
        super("MyIntentService");
    }


    @Override
    protected void onHandleIntent(Intent intent) {

        //这里进行耗时操作
    }


    public static void init(Context context) {

        Intent intent = new Intent(context, MyIntentService.class);

        context.startService(intent);

    }

}

在清单文件中进行注册:

<service
            android:name=".ui.MyIntentService"
            android:exported="false"></service>

如果想省去注册这步,可以直接借助Studio,File ->New ->Service ->IntentServic,直接创建即可。

在application中代码如下

MyIntentService.init(this);

把耗时操作直接放在,intentService中进行处理即可。

在实际应用中,这三种方案我们可以混搭使用,让其优化效果更加完美。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37900927/article/details/80079270

智能推荐

一文搞定MAVLINK软件协议_TYINY的博客-程序员秘密

这里面最吸引我的是这句,纠结了我很长时间的chan居然默认为0摘自:https://mp.weixin.qq.com/s/iGURlSS7V-5iBCEtgpzT7w一文搞定MAVLINK软件协议原创 L君 TBUS社区 2019-11-06本文纯属资深程序猿个人观点,旨在让大家从不同的角度理解MAVLINK协议,文中包含的一些玩笑话,大家不要当真,看着玩玩儿呗~搞开源无人机的朋友最耳熟能详的莫过于它的通讯协议MAVLINK了。Mavlink----一个又好气..

Android热修复实战之AndFix_一叶难遮天的博客-程序员秘密

写在前面上一篇《Android热修复技术简介》中对Android的热修复技术的概念和常用的技术方案做了一个简单的介绍,那么今天就来实战一下热修复技术,我们使用的是AndFix,为什么是它?因为无论是从使用上还是原理上AndFix都是相对简单的,毕竟这是实战的第一篇,还是要有个由易到难的过程的,好了,话不多说,开始吧!一、AndFix基本介绍1.1、AndFix简介AndFix项目地址:https://github.com/alibaba/AndFix,大家访问这个地址去看它的详细介绍,我这里

ORACLE11G实战演练--容灾与备份篇(一)_fliks0的博客-程序员秘密

冷备如果条件允许的情况下,可以使用传统冷备操作,步骤十分简单,停止数据库后,将需要备份的数据文件、控制文件、日志文件等拷贝一份即可。热备前提开启归档模式查询一下用户对应关系,我们用SCOTT测试,所在表空间为USERSoracle 查看用户所在的表空间:select username,default_tablespace from dba_users orde...

CSS学习之 文本属性_风平的博客-程序员秘密

1、文本缩进(text-indent)      只能应用于块级元素。示例:p {text-indent:2em;}2、水平对齐(text-align)      值:left | center | right | justify(两端对齐) | inherit3、垂直对齐(vertical-align)      值:baseline(基线对齐) | sub(下标) | su

IDEA External libraries 不显示Maven中引入的repository解决方法_我怎么又饿了呀的博客-程序员秘密

IDEA External libraries 不显示Maven中引入的repository解决方法新建的项目,idea左侧External Libraries里,没有Maven的依赖

Boost.Python3将C++代码封装为Python模块,并在Python中调用封装的动态库so文件cmake, boost, opencv3,numpy_cmake 生成动态库 python调用_little_YYYYY的博客-程序员秘密

利用boostpython封装c++函数的几个小例子opencvinteract.cpp#include &lt;stdio.h&gt;#include &lt;opencv2/opencv.hpp&gt;#include &lt;boost/python.hpp&gt; using namespace cv; int main(){}void visualize(){ ...

随便推点

什么是编程?程序员主要做啥工作?如何学习呢?_编程工作_酒酿小小丸子的博客-程序员秘密

可能有很多其他行业的同事想要转到程序员这个职业,但却不知道如何入手,不知道从哪儿开始。一般来说,编程的入门最低门槛是“会使用电脑”,这个要求对于现在的人来说应该不是什么大问题吧。那会使用电脑就算入门了吗?不是,编程的第一课不是写代码,而是明确方向,你是想成为一个什么样的程序员?前端开发?后端开发?运维测试?所以你需要知道程序员当中有哪些岗位,程序员也只是众多工种的统称。

Spring Security + OAuth2 - 黑马程序员(7. Spring Security实现分布式系统授权【从头重写】- UAA)学习笔记_yuan_404的博客-程序员秘密

上一篇:Spring Security + OAuth2(6. JWT 令牌)文章目录1. 需求分析2. 注册中心我自己是用的 ==Nacos== ,如果是想和视频对照着看的注意一下,这边和视频不一样3. 网关3.1 创建工程我自己是用的 ==Gateway== ,和视频不一样3.2 token配置3.3 配置资源服务3.4 安全配置4. 转发明文 token 给微服务1. 需求分析技术方案如下:说明:UAA认证服务负责认证授权。所有请求经过 网关到达微服务网关负责鉴权客户端以及请求转发

matlab wlan system,MATLAB,Simulink. - WLAN Toolbox, 無線區域網路工具箱 -鈦思科技_吴遇安的博客-程序员秘密

Introduction無線區域網路系統工具箱提供符合標準的功能的無線LAN通訊系統之設計,模擬,分析和測試功能。該系統工具箱提供針對IEEE 802.11ac標準和802.11n / G / A / B類標準中可配置的實體層波形。它也提供了發射機,通道建模,和接收器的操作,包括通道編碼,調變(OFDM、DSSS和CCK),通道空間串流指派,通道模型(TGac and TGn)),和MIMO接收...

什么是程序员_noock的博客-程序员秘密

对于前几天的一篇博文《好的程序员应该熟悉的几门编程语言》,有网友质疑我对程序员的定义,很可能是感觉我对程序员的定义超出了其想象,但事实上程序员的定义应该远远超乎其想象。这里说明一下我对程序员的理解,也没有绝对的对错,不同意见的朋友可以讨论,疏漏部分期待补充,欢迎交流沟通。    在软件工程上“软件=程序+文档”,有些把数据也列为软件的一个要素,但我喜欢把数据当成程序的一部分,因为数据是用于记录

LeetCode - 3. 无重复字符的最长子串——哈希表、双指针、滑动窗口法、字符串_yours_棒棒糖的博客-程序员秘密

3. 无重复字符的最长子串题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的

自学web前端练手——简易版成绩统计页面(html+css+js)_web评分页面设计_lvshaoshishang的博客-程序员秘密

遇到的问题:①刚开始innerHTML一直显示不出来,然后发现是犯了之前跟“js的随机验证码和验证”这篇博文一模一样的错误_(:з」∠)_var number=f1.getElementsByTagName(‘input’);//获取到的时一组元素,number[i]时其中的一个文本框元素,它的值得通过value属性来获取,number[i].value才是某个文本框元素的值②表单提交后...

推荐文章

热门文章

相关标签