App启动原理和启动过程

Android Framework学习五:APP启动过程原理及速度优化 文章摘要:本文详细介绍了Android应用程序(APP)启动优化的方向与流程,并深入解析了APP启动的完整过程。优化方向包括减少启动时间、优化资源加载等。启动流程涉及多个关键组件,如Launcher、ActivityTaskManagerService(ATMS)和Binder等。文章通过代码示例展示了从用户点击应用图标到系统进程ATMS处理启动请求的详细步骤,包括Launcher调用startActivity、Instrumentation.execStartActivity的调用,以及ATMS的star 阅读详情

一、程序启动原理

1.1、main函数中执行了一个UIApplicationMain这个函数UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

1.2、argc、argv:直接传递给UIApplicationMain进行相关处理即可 

     principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

     delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议

1.3、UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

1.4、接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对application:didFinishLaunchingWithOptions:方法)

1.5、程序正常退出时UIApplicationMain函数才返回

 

 

 

 

#import <UIKit/UIKit.h>
#import"AppDelegate.h"int main(int argc, char * argv[])
{
    @autoreleasepool {
        // return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        // return UIApplicationMain(argc, argv, @"UIApplication", NSStringFromClass([AppDelegate class]));/*
         argc: 系统或者用户传入的参数个数
         argv: 系统或者用户传入的实际参数
         1.根据传入的第三个参数创建UIApplication对象
         2.根据传入的第四个产生创建UIApplication对象的代理
         3.设置刚刚创建出来的代理对象为UIApplication的代理
         4.开启一个事件循环
         */return UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");
    }
} 

二、程序启动的完整过程

 

从main文件开始说起程序启动分为两类:1.有storyboard 2.没有storyboard

(一)有storyboard情况下:
1.main函数

2.UIApplicationMain

    - 创建UIApplication对象

    - 创建UIApplication的delegate对象

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

    - 创建UIWindow

    - 创建和设置UIWindow的rootViewController

    - 显示窗口

(二)没有storyboard情况下:
1.main函数

2.UIApplicationMain

    - 创建UIApplication对象

    - 创建UIApplication的delegate对象

3.delegate对象开始处理(监听)系统事件(没有storyboard)

    - 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

    - 在application:didFinishLaunchingWithOptions:中创建UIWindow

    - 创建和设置UIWindow的rootViewController

    - 显示窗口

 

Main方法的作用:

1.根据第三个参数创建UIApplication对象,该对象为空就是默认创建UIApplication对象,该参数只能是UIApplication或者UIApplication的子类

该参数的写法可以有: nil,@“UIApplication”,NSStringFromClass([UIApplication class])

2.根据第四个参数创建应用程序代理,并将代理对象设置给application对象的delegate属性

3.开启时间循环,包括应用程序的循环运行,并开始处理用户事件

4.根据info.plist加载最主要的storyboard文件(默认是Main.storyboard,创建箭头指向的控制器(默认是viewController)


 

Win10/Win11系统下,用VSCode编译Betaflight固件最全避坑指南(从GCC安装到HEX生成) 本文详细介绍了在Win10/Win11系统下使用VSCode编译Betaflight固件的完整流程,包括GCC安装、环境变量配置、终端选择、Make工具安装等关键步骤,帮助开发者避开常见陷阱,高效生成HEX文件。特别针对VSCode环境优化和编译错误排查提供了实用解决方案。 阅读详情

相关推荐

使用 FastAPI 构建高性能异步接口服务(含完整项目示例)

python复制编辑python复制编辑= 1: raise HTTPException(status_code=404, detail="用户不存在")特性FastAPI 支持情况类型注解✅自动文档✅异步支持✅ORM 集成✅(推荐 SQLModel)性能✅ 极高FastAPI 是你构建现代化、高性能 Python Web 应用的首选框架!

2501_92823525的博客 1302

Android应用程序运行原理

每次启动APP都需要加载任何存在于其中的类,并且调用主线程的消息循环来管理它们。Dalvik执行定义在库(即android runtime library)中的那部分,并通知任何特别感兴趣的对象以反映进度。Android每次启动时,都会检查新安装以及升级后的APP,如果有DEX改变,则需要重新优化该部分代码。在运行应用过程中,即使没有.dex文件,也不必再去重建它们。系统加载应用程序某些组件时将调用特定类的默认构造函数来进行初始化,并使用R类引用从xml资源获取各种类型的值。

m0_73868973的博客 1893

晶振(晶体振荡器)测试方法详解

晶振测试方法分为无源和有源两种类型。无源晶振(两脚)需用示波器测试波形,重点关注正弦波形状、200mV-1.5Vpp幅值和频率精度;有源晶振(四脚)通电后直接输出方波。测试要点包括:示波器使用10X探头、AC耦合,带宽需5倍于晶振频率;万用表可初筛短路/开路;替换法是工程最有效方法。常见故障排查顺序:供电→复位→焊接→型号→负载电容→波形观察→更换晶振→MCU配置。负载电容需按公式计算匹配,示波器观察是核心测试手段。

jiujiujinyuxi的博客 926

Android启动流程、app启动原理

从头分析整理学习底层知识。 Android 众多基于Linux内核的系统类似, 启动系统时, bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进程)"的底层的Linux进程, 诸如android debug deamon, USB deamon等. 这些守护进程处理底层硬件相关的接口.随后, init进...

grandself的博客 8884

树莓派编译程序时遇到卡死的问题

使用树莓派编译程序的时候,我遇到了程序比较大,编译到某个文件的时候树莓派会死机,关机之后重启可以继续使用,但是编译到同一个地方树莓派又死机的问题。 这个问题出现的主要原因是我给树莓派安装的Ubuntu mate 16.04 系统默认设置的swap交换空间不够,而编译某些文件的时候需要较大的交换空间,树莓派的交换空间被用满所以树莓派看起来好像是死机了的样子。 解决方法,扩展Ubuntu的交换空间。 解决方法,扩展Ubu

一杯二锅头 1万+

全国各省份影像下载地址(11级别)

cesium中使用urltemplate加载,leaflet中使用tile加载,具体加载有问题可以给我留言。

资深三维GIS开发 5144

App启动流程分析(一)

(注意:因为App进程与system_server进程通信是通过Binder实现的,Binder会开辟Binder线程池,那么此时这个方法的调用是在子线程中完成的,像bindApplicaiton最终需要调用Applicaiton的onCreate方法,但是这个方法是在主线程中,因此需要Handler完成线程切换):在上述第5步的system_server进程在收到请求后,除了通过Binder IPC 向App进程发送bindApplication外,还会发送scheduleTransaction.

u010257931的博客 1556

在 SAP BTP 中为 SAP AI Core 创建 Service Instance 和 Service Key 的完整实战指南

摘要:本文详细介绍了在SAP BTP上创建AI Core服务实例和密钥的关键步骤,这是实现ABAP系统与Gen AI大语言模型集成的核心技术环节。文章通过一个制造业财务问答场景的案例,系统梳理了从前提条件准备、架构理解到具体操作的全过程,重点解析了service instance创建、X.509证书配置等关键节点。特别强调了Extended计划选择、证书格式等易错点,为ABAP开发人员实现Gen AI场景提供了实用指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

Android App启动流程和源码详解

之前看了些App启动流程的文章,但是看得很浅显,隔了没多久就忘了,自己抓耳挠腮的终于看完了,看得头疼哦。因为很多是个人理解,大哥们主打一个7分信,2分思考,1分怀疑哈。主要看的源码是Android 9 的源码,因为很多framework的代码在AS里面看需要配置,我没配好,于是找了几个网站,最后综合下来用的这个Android社区 - https://www.androidos.net.cn1.在Android中,通过包名和Activity类名就可以打开一个APP。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 3051

4、机器人建模、规划与控制及运动学知识解析

本博客深入解析了机器人建模、规划与控制的核心内容,涵盖运动学与动力学的基本原理,并结合典型应用场景探讨了移动机器人与操作器的控制策略。同时,博客还介绍了机器人技术的发展趋势及其在工业和服务领域的广泛应用。

desk3的博客 123

指纹浏览器 WebGPU:新一代图形指纹的检测趋势与提前防御

指纹浏览器与风控系统对抗已升级至硬件层面。传统基于WebGL的API拦截和像素噪声技术,在WebGPU时代因架构变革而失效。WebGPU通过Compute Shader直接测量GPU物理算力,暴露了软件模拟的致命缺陷。防御需转向真实GPU硬件直通和虚拟化技术,如vGPU分割算力并伪装特征,以应对风控系统对硬件拓扑和浮点精度的检测。唯有基于物理算力的拟态,才能抵御新一代图形指纹的降维打击。

数据知道的博客 217

Android 面试必备 - 系统、App、Activity 启动过程

从开机启动到Home Launcher:启动bootloader (小程序;初始化硬件)加载系统内核 (先进入实模式代码在进入保护模式代码)启动init进程(用户级进程 ,进程号为1)启动Zygote进程(初始化Dalvik VM等)启动Runtime进程启动本地服务(system service)启动 HomeLauncher。

2501_90425233的博客 1027

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

算法如诗的博客 258

(一)APP 启动原理 —— 优化启动黑白屏

版权声明:本文为博主原创文章,未经博主允许不得转载。 本文纯个人学习笔记,由于水平有限,难免有所出错,有发现的可以交流一下。 一、启动黑屏、白屏 有的 App 在启动时会出现一段时间的黑屏或者白屏。这就是俗称的启动黑白屏的问题。这期间弄得用户不知道该干嘛,体验不好。 App 启动时间是什么 ,从哪里开始 (我们要知道启动时间是怎么算出来的) https://segmen...

孤独灬啸月 1515

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

APP启动过程

【原文地址 APP启动过程】 It's right time to learn Android's Framework ! 前言 一个App是怎么启动起来的?App的程序入口到底是哪里?Launcher到底是什么神奇的东西?听说还有个AMS的东西,它是做什么的?Binder是什么?他是如何进行IPC通信的?Activity生命周期到底是什么时候调用的?被谁调用的?等等...

大神了没 3639

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

Android Activity启动流程, app启动流程,APK打包流程, APK安装过程 1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation.execStartActivity()执行(Instrumentation主要用来监控应用程序和系统的交互)启动,execStartActivity()方法里面有2个方法,一个是ActivityManagerNa

heng615975867的专栏 594

android activity启动流程_App启动优化Google官方指导

前言本次主要内容包括:1、App的启动方式2、启动过程分析以及优化方案3、启动耗时统计一、App的启动方式谷歌官方文档App启动有三种状态,每种状态都会影响App对用户可感知的时间:冷启动,热启动和温启动。在冷启动中,应用从头开始启动。在其他状态下,系统需要将后台运行中的应用带入前台。建议您始终在假定冷启动的基础上进行优化。这样做也可以提升温启动和热启动的性能。要优化应用以实现快速启动,...

weixin_39701735的博客 307

android app启动分析,Android开发笔记——如何正确实现App启动页

启动页在当前的Android APP中有着广泛的使用,在Material Design规范出来之前,Android官方是不推荐使用启动页的,理由是让用户在启动APP后干等是一种浪费时间的行为。Material Design 则制定了LaunchScreen 规范,用于在APP启动的时候合理的利用从启动到实际渲染出主界面之间这段时间,显示一个LauncherScreen用来展示一些品牌元素等信息,避...

weixin_34072003的博客 173

Android APP启动过程中应用代码的加载

Android APP启动过程中应用代码的加载APP启动过程 zygote->ActivityThread过程略过 ActivityThread main函数 attach->ActivityManagerNative获得AMS代理对象IActivityManager ->AMS attachApplication AMS attachApplication ProcessRecord

大象杂货 4566

调用其他app 的lib_APP启动优化

APP启动优化通过阅读这篇文章,我们将了解APP启动过程中都做了哪些事情。文章分为三部分,第一部分是原理讲解,第二部分是优化方案,第三部分是实践应用。第一部分 原理讲解APP启动的分类APP分为冷启动和热启动。冷启动是指, App 点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的情况。这是一次完整的启动过程。热启动,对于热启动的理解存在分歧,一种是是指户点击home键...

weixin_39626089的博客 384

Android app启动流程分析

app的启动方式 App启动有三种状态,每种状态都会影响App对用户可感知的时间:冷启动,热启动和温启动。 注意:在冷启动中,应用从头开始启动。在其他状态下,系统需要将后台运行中的应用带入前台。建议您始终在假定冷启动的基础上进行优化。这样做也可以提升温启动和热启动的性能。 冷启动 冷启动是指应用从头开始启动:系统进程在冷启动后才创建应用进程。发生冷启动的情况包括应用自设备启动后或系统终止应用后首次启动 特点:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和

离开家坐火车的博客 1056

Android Framework 框架系列之 App 启动优化

极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能用户希望APP能够快速响应并加载。 一个启动速度慢的AP...

程序员Android 1081

android app 开机画面,Android开发笔记——如何正确实现App启动页

启动页在当前的Android APP中有着广泛的使用,在Material Design规范出来之前,Android官方是不推荐使用启动页的,理由是让用户在启动APP后干等是一种浪费时间的行为。Material Design 则制定了LaunchScreen 规范,用于在APP启动的时候合理的利用从启动到实际渲染出主界面之间这段时间,显示一个LauncherScreen用来展示一些品牌元素等信息,避...

weixin_42514921的博客 426

论一个APP从启动到主页面显示经历的过程?

前言 (个人观点.不喜勿喷) 本部分内容是关于Android进阶的一些知识总结,涉及到的知识点比较杂,不过都 是面试中几乎常问的知识点,也是加分的点。 关于这部分内容,可能需要有一些具体的项目实践。在面试的过程中,结合具体自 身实践经历,才能更加深入透彻的描绘出来。 (年前有很多加我,今天才一一回复,发现很多都失效了,需要的可以重新加一次) (顺手留下GitHub链接,需要获取相关面试等内容的可...

Android_SE的博客 2726

Android进阶——性能优化之APP启动时黑白屏的根源解析及对应的优化措施小结(一)

引言 相信闪屏对于所有人来说都不陌生,每次打开互联网APP的时候先弹出来一些挠人的小广告,这就是现在闪屏的典型应用,但当初Google推出闪屏是用来在App未完全启动的时候,让用户不至于困惑App是否启动而加入的一个设计。而现在的很多App,基本上都把闪屏当做一个广告、宣传的页面了,貌似已经失去了原本的意义,但闪屏,不管怎么说,在一个App启动的时候,都是非常重要的,这也就间接暗示了需要去关注A...

最美不过,心中有梦,身旁有你! 3746
上一篇: 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
下一篇: iOS Strong和Copy 理解
LIN1986LIN
博客等级 码龄19年 17粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值