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

Android冷启动优化

一、应用启动的三种状态

冷启动:系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP,此时,APP的启动将经历两个阶段:

1、创建app进程:系统启动应用程序进程和虚拟机,创建app进程,app启动后第一时间显示空白window

2、创建应用程序对象、初始化、加载资源:创建application对象、创建主Activity对象、并执行onCreate方法、创建和显示应用程序主界面。

热启动:当我们按了Home键或其它情况app被切换到后台,再次启动app的过程。热启动是指应用程序在保留应用程序进程的情况下再次启动的启动方式,这种启动方式相对于冷启动要快得多,因为应用程序的许多资源和进程已经存在于系统内存中,不再需要重新创建和加载。

温启动:温启动包含了冷启动的一些操作,由于app进程依然在,温启动只执行冷启动的第二阶段,这代表着它比热启动有更多的开销。
这三种启动状态中,冷启动是一个从无到有的过程最为耗时,也是下面主要的优化方向

二、冷启动优化方式

1、冷启动白屏优化

在app启动之后会立即展示一个空白的window,用于告诉用户当前正在启动app,但是这种方式显然不够美观,下面介绍两种方式对这种现象进行优化

1、禁用app启动时window预览功能(不显示空白的window)

在首屏Activity中添加一个主题,禁用window预览功能,并在manifest中使用

<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style><!--禁用预览功能主题--><style name="AppSpalshNoPreviewTheme" parent="AppTheme"><item name="android:windowFullscreen">true</item><item name="windowNoTitle">true</item>//禁用预览<item name="android:windowDisablePreview">true</item></style>
</resources>

在manifest中使用

<activity android:name=".SplashActivity"android:theme="@style/AppSpalshNoPreviewTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

此时冷启动app,会卡顿一会再进入首activity,感觉就像手机卡了,用户体验不是很好,不建议使用!
2、给启动页Activity添加一个主题,设置一个背景

<!--替换首屏的背景的主题--><style name="AppSpalshBackgroundTheme" parent="AppTheme"><!--设置一个背景图片--><item name="android:windowBackground">@mipmap/wall</item><item name="android:windowFullscreen">true</item><item name="windowNoTitle">true</item></style>

然后在manifest中使用

<activity android:name=".SplashActivity"android:theme="@style/AppSpalshBackgroundTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

此时白屏就会被替换成首Activity主题中添加的背景图片,从而使程序更加美观,也会让用户有更好的体验

3、使用jetpack splashScreen

参考:深度探讨 Jetpack SplashScreen 如何重塑应用启动画面_setkeepvisiblecondition-CSDN博客

2、主页面布局优化

1、减少布局嵌套层次,复杂布局可以使用ConstraintLayout和RelativeLayout来替换LinearLayout

2、推荐使用merge标签,可以减少一个层级

3、使用ViewStub延迟加载

<ViewStubandroid:id="@+id/contentPanel"android:inflatedId="@+id/inflatedStart"android:layout="@layout/delayInflateLayout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"/>

4、去掉多余背景色,减少复杂shape的使用

3、Application和主Activity的onCreate方法中的操作优化

1、Application的onCreate流程,对于大型的APP来说,通常会在这里做大量的通用组件的初始化操作;建议:一些三方的SDK,文件,设备,线程池,等等工具类不放在Application初始化,我们可以放到用到的地方才进行初始化操作。如果确实需要在这里初始化,可以开启一个子线程来初始化

2、不要在Application和主Activity的onCreate方法中执行耗时操作。

http://www.lryc.cn/news/324066.html

相关文章:

  • jmeter之接口功能自动化
  • 【openGL4.x手册07】几何着色器
  • 鸿蒙OpenHarmony开发实战:【MiniCanvas】
  • 【JavaEE初阶系列】——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)
  • flutter-elinux的基本介绍及安装调试
  • 二分查找法总结
  • Python工具-清理Unity(批量深度)清理U3D项目工程保留关键工程文件
  • vue 安装脚手架报错 certificate has expired
  • 使用 Python 快速开始机器学习
  • CCDP.02.OS正确部署后的Dashboard摘图说明
  • 【计算机视觉】Gaussian Splatting源码解读补充(二)
  • Java transient 关键字
  • 前端工程化(三)邂逅Webpack和打包过程
  • Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)
  • Jmeter-基础元件使用(二)-属性及对数据库简单操作
  • docker 的八大技术架构(图解)
  • LeetCode-热题100:131. 分割回文串
  • 常用相似度计算方法总总结
  • 【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698
  • AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁
  • 鬼灭之刃-激情台词-02(解释来自文心一言)
  • openssl3.2 - exp - aes-128-cbc
  • 基于docker+rancher部署Vue项目的教程
  • Elasticsearch:让你的 Elasticsearch 索引与 Python 和 Google Cloud Platform 功能保持同步
  • 如何定位web前后台的BUG
  • 谈谈 IOC 和 AOP
  • C/C++之内存旋律:星辰大海的指挥家
  • Linux下进程的调度与切换
  • Linux相关命令(2)
  • React中 类组件 与 函数组件 的区别