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方法中执行耗时操作。
相关文章:
Android冷启动优化
一、应用启动的三种状态 冷启动:系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP,此时,APP的启动将经历两个阶段: 1、创建app进程:系统启动应用程序进程和虚拟机,创建app…...
jmeter之接口功能自动化
一、接口测试简述 接口:用来连接前端,后端还有移动端的程序模块。由于不同端的工作进度不一样,需要对最开始出来的接口进行接口测试。 接口分类:POST,GET,PUT,DELETE。 POST请求的数据是放在…...
【openGL4.x手册07】几何着色器
目录 一、说明二、关于几何着色器三、原始输入/输出规范3.1 实例 四、输入五、输出5.1 分层渲染 六、输出限制 一、说明 几何着色器对于渲染管线设计是一个新生事物;目前对应于几何着色器的资料不多,并且说法不一,因此如何用几何着色器&…...
鸿蒙OpenHarmony开发实战:【MiniCanvas】
介绍 基于OpenHarmony的Cavas组件封装了一版极简操作的MiniCanvas,屏蔽了原有Canvas内部复杂的调用流程,支持一个API就可以实现相应的绘制能力,该库还在继续完善中,也欢迎PR。 使用说明 添加MiniCanvas依赖 在项目entry目录执行…...
【JavaEE初阶系列】——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)
目录 🚩单例模式 🎈饿汉模式 🎈懒汉模式 ❗线程安全问题 📝加锁 📝执行效率提高 📝指令重排序 🍭总结 单例模式,非常经典的设计模式,也是一个重要的学科&#x…...
flutter-elinux的基本介绍及安装调试
搜集到两个很有用的网站: 1、flutter-elinux的基本介绍:https://juejin.cn/post/7257285697383612453 2、flutter-elinux的安装调试等:https://github.com/sony/flutter-elinux/wiki 其中,在flutter-elinux设置环境变量时&#…...
二分查找法总结
目录 1、思路讲解(LC704)2、代码思路讲解(循环不变量)(1) 左闭右闭(2)左闭右开(3)总结:左开右闭和左闭右开(4)复杂度分析 …...
Python工具-清理Unity(批量深度)清理U3D项目工程保留关键工程文件
前沿 1. Unity工程越来越多,很久不用的工程里存在了很多无用的大文件夹,极大的影响电脑容量。 2. 我电脑里面U3D工程只有17个,但容量就高达60GB,使用自己编写的工具清理后,减到了30GB多。清理了不是很重要的文件和文件…...
vue 安装脚手架报错 certificate has expired
vue 安装脚手架的时候报错,报错信息如下: 错误信息:npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired 翻译:npm ERR!请求到https://registry.npm.taobao.org…...
使用 Python 快速开始机器学习
🔗 快速开始 PyTorch|使用 Python 建立深度学习模型 认识 PyTorch 1.1 Torch 与 PyTorch 1.2 安装 PyTorch 1.3 验证安装并查看 PyTorch 版本PyTorch 深度学习模型的建立范式 2.1 准备数据 2.2 定义模型 2.3 训练模型 2.4 评估模型 2.5 做出预测为预测任…...
CCDP.02.OS正确部署后的Dashboard摘图说明
前言 在部署成功OpenStack后,应该可以在浏览器打开Dashboard,并对计算资源(这里主要是指VM)进行管理,也可以在Dashboard上面查看OpenStack是否存在错误,下面,已针对检查的关键点,用红…...
【计算机视觉】Gaussian Splatting源码解读补充(二)
第一部分 本文是对学习笔记之——3D Gaussian Splatting源码解读的补充,并订正了一些错误。 目录 三、相机相关scene/cameras.py:class Camera 四、前向传播(渲染):submodules/diff-gaussian-rasterization/cuda_rast…...
Java transient 关键字
Java字段不想序列化怎么办 在 Java 中,如果某个字段不想被序列化(即不希望被写入到序列化的数据流中),可以使用 transient 关键字进行标记。通过在字段前加上 transient 关键字,可以告诉 Java 序列化机制忽略该字段&am…...
前端工程化(三)邂逅Webpack和打包过程
目录 Vue项目加载Webpack 安装Webpack的默认打包创建局部的 webpack Vue项目加载 JavaScript的打包: 将ES6转换成ES5的语法; TypeScript的处理,将其转换成JavaScript; Css的处理: CSS文件模块的加载、提取&a…...
Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)
目录 一、前置说明 二、Gradle 启动! 2.1、安装 2.2、初始化项目 2.3、gradle 项目目录介绍 2.4、Gradle 项目下载慢?(万能解决办法) 2.5、Gradle 常用命令 2.6、项目构建流程 2.7、设置文件(settings.gradle…...
Jmeter-基础元件使用(二)-属性及对数据库简单操作
一、Jmeter属性 当我们想要在不同线程组中使用某变量,就需要使用属,此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…...
docker 的八大技术架构(图解)
docker 的八大技术架构 单机架构 概念: 应用服务和数据库服务公用一台服务器 出现背景: 出现在互联网早期,访问量比较小,单机足以满足需求 架构优缺点: 优点:部署简单,成本低 缺点࿱…...
LeetCode-热题100:131. 分割回文串
题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1: 输入: s “aab” 输出: [[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输入&am…...
常用相似度计算方法总总结
一、欧几里得相似度 1、欧几里得相似度 公式如下所示: 2、自定义代码实现 import numpy as np def EuclideanDistance(x, y):import numpy as npx np.array(x)y np.array(y)return np.sqrt(np.sum(np.square(x-y)))# 示例数据 # 用户1 的A B C D E商品数据 [3.3…...
【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698
漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的…...
天地图图层标识全解析:从代码到坐标系的实战指南
1. 天地图图层标识入门:为什么你需要了解这些代码? 第一次接触天地图开发时,我也被那些神秘的代码搞晕了。vec_w、cva_w、img_c...这些看起来像密码一样的字符串,其实藏着地图服务的核心秘密。简单来说,天地图的每个图…...
如何给 Go 语言的 TCP 聊天服务加上 ACK 可靠送达机制
如何给 Go 语言的 TCP 聊天服务加上 ACK 可靠送达机制 在我们学习 Go 语言网络编程时,实现一个简单的 TCP 聊天室往往是入门的必经之路。原项目8h-GoIM通过建立 TCP 连接并将接收到的文本广播给所有在线用户,非常直观地展示了 Go 语言在并发和通道设计上…...
3步释放20GB空间:DriverStore Explorer的系统驱动优化方案
3步释放20GB空间:DriverStore Explorer的系统驱动优化方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer(简称RAPR)是一款轻量…...
纽约州校园数据泄露激增背景下的安全治理与技术防御研究
摘要 2026 年 4 月 6 日,databreaches.net发布报道显示,2025 年纽约州校园数据安全事件同比大幅上升72%,其中长岛地区报告数量达44 起,揭示美国 K-12 教育机构在数据安全防护、账号权限管理、威胁监测与应急响应等方面存在系统性短…...
自动导引车(AGV)与自主移动机器人(AMR)控制系统的 C# 开源封装库瞧
为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...
好写作AI:毕业论文“智造”新引擎,开启学术创作新纪元!
在学术探索的征途中,毕业论文无疑是一座巍峨的山峰,让无数莘莘学子既期待又忐忑。但别怕,时代在进步,科技在发展,我们有了新的“登山装备”——好写作AI。它不仅是你的学术助手,更是毕业论文“智造”的新引…...
构建仓库与包管理
一、构建仓库 1、nexus安装 brew安装方式(比较慢) brew install nexus官网下载安装方式 去sonatype官网下载,比如MacOS的,下载完成之后cd到bin目录即可看到启动命令 启动 # 2.0版本 brew services start nexus # 3.0版本 /usr…...
Thiserror终极性能优化指南:避开5大常见陷阱的最佳实践
Thiserror终极性能优化指南:避开5大常见陷阱的最佳实践 【免费下载链接】thiserror derive(Error) for struct and enum error types 项目地址: https://gitcode.com/gh_mirrors/th/thiserror Thiserror是Rust生态中一款强大的错误处理工具,通过d…...
推三返一小程序(源码部署)
推三返一小程序源码部署指南环境准备确保已安装Node.js(建议版本14)、微信开发者工具、MySQL数据库(或云数据库)。 克隆或下载推三返一小程序源码至本地,检查package.json确认依赖完整性。后端配置修改server/config.j…...
飞利浦PhilipsMP系列监护仪协议对接实战指南
1. 飞利浦PhilipsMP系列监护仪协议对接基础 第一次接触医疗设备协议对接的开发者,可能会觉得这是个神秘的黑盒子。其实飞利浦MP系列的协议对接并没有想象中那么复杂,关键是要理解它的通信逻辑。我最早接触MP20的时候也踩过不少坑,后来发现只要…...
