Android App 启动状态有几种?
startup state
- Android 启动状态(startup state)
- 1.1、冷启动(Cold Start)
- 1.2、温启动(Warm Start)
- 1.3、热启动(Hot Start)
- 1.4、后台启动(Background Start)
- 优化(套话)待续
- 参考地址
Android 启动状态(startup state)
1.1、冷启动(Cold Start)
当应用尚未在内存中运行时,用户点击应用图标或通过其他方式启动应用时,会触发冷启动。
在这种情况下,应用需要从头开始加载并初始化,这可能需要一些时间,用户可能会感到启动时间较长。
启动流程:
https://blog.csdn.net/weixin_35691921/article/details/116143407?spm=1001.2014.3001.5501
启动时长:
可以理解为Application.onCreate() 到 Activity.onResume()
或者使用adb命令与性能测试工具
adb shell am start -W -n com.example.package/.MainActivity
1.2、温启动(Warm Start)
温启动介于冷启动和热启动之间。当应用在内存中部分被回收但仍有一些资源保留时,再次启动应用将触发温启动。这种情况下,应用需要重新初始化一些资源,但不需要完全从头开始加载。
温启动有很多场景,例如:
-
用户按连续按返回退出了app,然后重新启动app;
-
由于系统收回了app的内存,然后重新启动app。
-
进程仍然存在而Activity销毁
温启动的场景可以使用:onSaveInstanceState去保存需要的数据状态,在重建的时候可以在onCreate和onRestoreInstanceState中的参数去获取销毁前保存的数据。
Configuration 变换和主题切换也会触发:onSaveInstanceState和onRestoreInstanceState
App运行之后切换横竖屏,通过上面代码实验得到的结果是:
I/com.zj.activitylifecycle.LifeCycleActivity: —> onCreate
I/com.zj.activitylifecycle.LifeCycleActivity: —> onStart
I/com.zj.activitylifecycle.LifeCycleActivity: —> onResume
I/com.zj.activitylifecycle.LifeCycleActivity: —> onPause
I/com.zj.activitylifecycle.LifeCycleActivity: —> onSaveInstanceState
I/com.zj.activitylifecycle.LifeCycleActivity: —> onStop
I/com.zj.activitylifecycle.LifeCycleActivity: —> onDestory
I/com.zj.activitylifecycle.LifeCycleActivity: —> recreate
I/com.zj.activitylifecycle.LifeCycleActivity: —> onStart
I/com.zj.activitylifecycle.LifeCycleActivity: —> onRestoreInstanceState
I/com.zj.activitylifecycle.LifeCycleActivity: —> onResume
————————————————
原文链接:https://blog.csdn.net/mypotatolove/article/details/82217620
1.3、热启动(Hot Start)
重新启动,而不是从完全关闭的状态开始。
当应用已经在内存中运行,但用户在应用中导航到其他界面或按下 Home 按钮后,再次返回应用时,会触发热启动。
热启动相对较快,因为应用的部分状态和资源已经存在于内存中。
1.4、后台启动(Background Start)
后台启动指的是当应用在后台运行,而不在前台显示时触发的启动方式。这可能是由于应用接收到推送通知、执行定时任务或其他后台事件触发的。后台启动通常是对用户不可见的,因为应用不会立即出现在屏幕上。
优化(套话)待续
Android应用的冷启动优化是一个复杂而关键的任务。以下是一些具体的优化策略,帮助你提高Android应用的冷启动性能:
-
使用启动页(Splash Screen): 引入一个启动页,显示应用程序的标志或其他欢迎信息。这不仅可以为用户提供启动反馈,还可以让应用在后台进行一些初始化工作,从而减少用户感知的启动时间。
-
延迟加载: 通过将不是必需立即加载的组件延迟初始化,可以减小应用程序启动时的初始负担。使用懒加载模式,只有在需要时才初始化和加载相关组件。
-
应用程序分割(App Slicing): 使用应用程序分割特性,以便将应用程序的不同部分进行拆分并仅在需要时下载。这有助于减小APK文件的大小,加快应用程序下载和安装的速度。
-
减小APK大小: 优化资源、压缩图片、删除不必要的资源文件和代码,以减小APK的大小。这不仅有助于更快地下载和安装应用程序,还有助于加快应用的启动速度。
-
使用ProGuard进行代码混淆和优化: ProGuard是一个代码混淆和优化工具,可以帮助减小APK大小并提高运行时性能。确保在发布应用程序之前使用ProGuard来混淆和优化代码。
-
使用合适的数据存储: 使用合适的本地存储方式,以减小启动时需要加载的数据量。尽可能使用轻量级的数据存储,例如SharedPreferences或SQLite数据库。
-
异步初始化: 将应用程序的初始化任务异步执行,确保不会阻塞主线程。可以使用
AsyncTask、Loader、或者其他异步加载框架。 -
合理使用多线程: 在合适的情况下,使用多线程来进行一些耗时的初始化工作。但要注意在主线程上执行与UI相关的任务,以确保良好的用户体验。
-
优化布局文件: 精简布局文件,避免过度嵌套和不必要的层次结构。这有助于提高布局文件的加载速度。
-
使用预加载(Preloading): 在应用启动时预加载即将使用的资源和数据,以减小用户导航到相关页面时的加载时间。
-
性能分析和调试工具: 使用Android Studio提供的性能分析工具来检查应用程序的性能瓶颈,例如CPU使用率、内存使用情况等。这有助于精确定位问题并进行优化。
-
适配Android Vitals: 关注Android Vitals中的启动时间指标,如应用程序启动时间(App Start Time),确保在各种设备上都有较好的性能。
通过结合以上策略,可以显著提高Android应用的冷启动性能,提升用户体验。最终的优化方案可能需要根据具体应用的特点和需求进行调整。
参考地址
Android性能优化(一)App启动原理分析及启动时间优化:
https://blog.csdn.net/sakuramashiro/article/details/78986167
Android 性能优化:使用 TraceView 找到卡顿的元凶:https://www.ituring.com.cn/article/273967
相关文章:
Android App 启动状态有几种?
startup state Android 启动状态(startup state)1.1、冷启动(Cold Start)1.2、温启动(Warm Start)1.3、热启动(Hot Start)1.4、后台启动(Background Start) 优…...
Spring Cloud Alibaba Sentinel 简单使用
Sentinel Sentinel 主要功能Sentinel 作用常见的流量控制算法计数器算法漏桶算法 令牌桶算法Sentinel 流量控制Sentinel 熔断Sentinel 基本使用添加依赖定义资源定义限流规则定义熔断规则如何判断熔断还是限流自定义 Sentinel 异常局部自定义异常全局自定义异常系统自定义异常…...
nvm切换node后,没有npm
当我们想要在不同的 Node.js 版本之间切换的时候,通常会使用 nvm(Node Version Manager) 来完成。但是,当我们在使用 nvm 切换 Node.js 版本的时候,可能会遇到没有 npm 的情况。这种情况通常发生在我们在新环境或者重新…...
Redis-高性能原理剖析
redis安装 下载地址:http://redis.io/download 安装步骤: # 安装gcc yum install gcc# 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar…...
ORA-00600 【3948】,ORA-00600 【3949】
前言 这个报错没有从ORA600那个tool中查到。 回顾 环境 环境是windows 11203 rac环境,非归档数据库 有部分数据文件建到了本地文件系统。目标是将部分数据文件通过switch to copy的形式移动到diskgroup里 流程 srvctl关闭双节点, 启动单节点到moun…...
flink 查看写入starrocks的数据量 总行数
针对该connector: https://github.com/StarRocks/docs.zh-cn/blob/main/loading/Flink-connector-starrocks.md...
全链路压测的步骤及重要性
全链路压测是一种系统性的性能测试方法,旨在模拟真实用户场景下的完整操作流程,全面评估软件系统在不同压力下的性能表现。这种测试方法对于保证应用程序的高可用性、稳定性和可扩展性至关重要。 1. 全链路压测概述 全链路压测是在模拟实际用户使用场景的…...
使用Python实现几种底层技术的数据结构
使用Python实现几种底层技术的数据结构 数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这…...
前端面试题【72道】
文章目录 1. 说说你对盒子模型的理解2. css选择器有哪些?优先级?哪些属性可以继承?3. 元素水平垂直居中的方法有哪些?如果元素不定宽高呢?4. 怎么理解回流跟重绘?什么场景下会触发?5. 什么是响应…...
OpenGL 绘制文本(QPainter)
文章目录 一、简介二、实现代码三、实现效果一、简介 OpenGL中并没有绘制文本的相关函数,因此这里仍然用的是Qt中的QPainter工具来绘制文本,但是其相关的定位这里仍然会用OpenGL中的坐标转换。这里对其也进行封装一下,方便后续使用。 二、实现代码 TextDrawable.h #ifndef T…...
windows电脑连接Android和iPhone真机调试
windows电脑连接Android和iPhone真机调试 目前用的是Hbuilder X编辑器,在正常情况下,Android手机需要在 "设置 ----> 更多设置 ----->关于手机 ------> 版本号(手指点击5-7下即可打开开发者模式)"(我的是vivo的…...
windows上 adb devices有设备 wsl上没有
终于解决了!!!! TAT,尝试了很多种办法。 比如WSL中的adb和Windows中的adb版本必须一致,一致也没用,比如使用 ln 建立链接也没用。 这个解决办法的前提是windows中的abd是好用的。 ●在windows…...
释放搜索潜力:基于Docker快速搭建ES语义检索系统(快速版),让信息尽在掌握
搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…...
JS--localStorage设置过期时间的方案(有示例)
原文网址:JS--localStorage设置过期时间的方案(有示例)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用localStorage设置数据的过期时间。 问题描述 localStorage是不支持设置过期时间的,cookie虽然支持设置过期时间但它存的数据量很小。所…...
JNPF开发平台凭什么火?
一、关于低代码 JNPF平台在提供无代码(可视化建模)和低代码(高度可扩展的集成工具以支持跨功能团队协同工作)开发工具上是独一无二的。支持简单、快速地构建及不断改进Web端应用程序,可为整个应用程序的生命周期提供全…...
关于“计算机中由于找不到msvcr120.dll,无法继续执行代码5种解决方法
今天,我想和大家分享一下关于“由于找不到msvcr120.dll,无法继续执行代码5种解决方法”的话题。在我们日常的使用中,有时候会遇到这样的问题:在运行某个程序时,突然提示“无法继续执行代码,因为找不到msvcr120.dll”。…...
LR学习笔记——基本面板
文章目录 面板介绍色彩调整区域明暗调整区域纹理及质感色彩饱和 面板介绍 面板如上图所示 基本可分为几个板块:色彩、明暗、纹理及质感、色彩饱和 色彩调整区域 色温:由蓝色和黄色控制色调:由绿色和洋红控制 互补色:蓝色对黄色&…...
Cloud 微服务
架构 一 单体架构 1 概念 将项⽬所有模块(功能)打成jar或者war,然后部署⼀个进程。 互联网早期,一般的网站应用流量较小,只需一个应用,将所有功能代码都部署在一起就可以,这样可以减少开发、…...
若依前后端分离版,快速上手
哈喽~大家好,这篇来看看若依前后端分离版,快速上手(肝了挺久的)。 🥇个人主页:个人主页 🥈 系列专栏:【Springboot和Vue全栈开发】…...
Java-抽象类、抽象方法
【1】抽象类和抽象方法的关系: 抽象类中可以定义0-n个抽象方法。 【2】抽象类作用: 在抽象类中定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类的抽象方法,…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
