热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android面试系列冷启动优化

什么是冷启动?冷启动的定义冷启动就是在启动应用前,系统中没有该应用的任何进程信息时候的启动(第一次打开应用,或者杀死了这个

什么是冷启动?


  1. 冷启动的定义

    冷启动就是在启动应用前,系统中没有该应用的任何进程信息时候的启动(第一次打开应用,或者杀死了这个app进程后的启动)

  2. 冷启动/热启动的区别

    热启动定义:用户使用app返回键退出应用,然后马上又重新启动应用。

    区别一:app的进程是否在手机中已经存在了,冷启动时app的进程并不存在,需要重新创建;热启动是App的进程已经存在了,不需要再重新创建。

    区别二:冷启动因为之前手机中没有App的进程2,先创建Application类,再创建MainActivity类;热启动会从已有的进程来启动,不会再走Application类,而是直接启动MainActivity类(注,一个应用重新进程的创建,到新进程的销毁,MyApplication类只初始化创建一次,也就是说热启动的时候,代码并不走MyApplication这个类)

  3. 冷启动时间的计算

    冷启动的时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即第一个Activity内容对用户可见)为止。


冷启动流程


  • Zygote进程中fork创建出一个新的进程
  • 创建初始化Application类,创建MainActivity类
  • setContentView布局,判断DecorView的存在,通过 inflate将View添加到DecorView的mContentParent中(DecorView会和ViewRoot的实现类ViewRootImpl有一个关联依赖,后面的几个方法是ViewRootImpl中的),这里用到了onMeasure/onLayout/onDraw这几个方法来完成里面View内容)
  • 当onCreate/onStart/onResume方法走完,Activity的onResume方法,接着会调用Activity的makeVisible(),在该方法中DecorView真正完成了添加显示到Window中,Activity的视图能被用户看到。

冷启动流程后引起的黑白屏错觉卡顿问题


  1. 黑白屏错觉卡顿问题出现的原因
    在冷启动流程第三步的时候View添加到了mCOntentParent中,但是这时候DecorView并没有被WindowManager识别,在第四步的makeVisiable()方法中

void makeVisable(){if(!mWindowAdded){ViewManager wm=getWindowManager();wm.addView(mDecor,getWindow.getAttributes());mWindowAdded=true;}mDecor.setVisibility(View.VISIBLE);
}

DecorView真正的完成了添加和显示这两个过程,但是wm会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素,然后才去真正的加载布局,如果这个时间过长,而默认的背景又是黑色或者白色,这样会给用户造成一种错觉,这个APP很卡,很不流畅会出现黑色或者白色屏幕闪过,自然也影响了用户体验。

  1. 黑白屏错觉卡顿解决办法

(1)App启动页面为图片或者是drawable文件

//style中

//权限文件中
".ui.splash.SplashActivity"android:screenOrientation="portrait"android:theme="@style/ThemeSplash">filter>"android.intent.action.MAIN" />"android.intent.category.LAUNCHER" />filter>

设置设置整个App的style文件,设置Android:background属性为图片或者是drawable文件,这样App在启动过程中就是显示的是启动页面的图片或者是是drawable文件;

(2)App启动页面为Layout文件

这时候无法为App的style设置background,退而求其次主流的方式是设置白色背景

<item name&#61;"android:windowBackground">&#64;color/color_ffffffitem>

而这里的&#64;color/color_ffffff就是我们定义的白色色值&#xff0c;这样经过处理之后App启动时就不会出现黑屏的效果了。

如何优化冷启动的实际


  1. 在Application中的onCreate()方法中减少工作量&#xff0c;第三方sdk有一个懒加载操作判断使用的时候调用
  2. 不要让Application参与业务的操作
  3. 不要让Application进行耗时的操作(io操作大忌)
  4. 不要以静态变量的方式在Application中保存数据&#xff0c;静态变量生命周期和app是一样&#xff0c;会造成内存泄漏&#xff0c;数据安全等问题
  5. 布局/mainThread MainActivity,View层级减少&#xff0c;可以选择懒加载按需加载;有一些资源的初始化放在子线程中初始化

推荐链接:黑白屏卡顿分析:https://blog.csdn.net/zivensonice/article/details/51691136


推荐阅读
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
author-avatar
莪啝伱在一敧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有