2019独角兽企业重金招聘Python工程师标准>>>

根据以上两张图片来看,app的启动过程如下:

1、打开app,调用main函数

2、main调用UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))

第三个参数nil:代表UIApplication类名或者子类名称,nil 相当于 @"UIApplicaiton";
第四个参数:代表UIApplicaiton的代理名称NSStringFromClass([AppDelegate class] 相当于 @"AppDelegate";

2.1、UIApplicationMain创建UIApplication对象,AppDelegate对象(UIApplication的代理)

2.2、UIApplication开启运行循环(Main Runloop)

注:UiApplication代表一个应用程序,每一个应用程序都有一个UIApplication全局对象(单例),我们在程序中可以通过[UIApplication sharedApplication]获得这个对象,进行一些应用级的操作。UIApplication负责监听接收事件,而由UIApplicationDelegate决定应用程序如何去响应这些事件(生命周期:程序启动和关闭,系统事件:来电、记事项警告)等等。

2.3、加载info.plist,判断是否指定mian(xib或者storyboard)如果指定就去加载

3、UIApplicationDelegate对象开始处理监听到的事件(

程序启动成功之后,首先调用application:didFinishLaunchingWithOptions:方法,
  如果info.plist文件中配置了启动storyboard文件名,则加载storyboard文件。
  如果没有配置,则根据代码来创建UIWindow--->UIWindow的rootViewController-->显示)

info.plist文件:

Localiztion native development region CFBundleDevelopmentRegion 本地化相关,如果用户所在地没有相应的语言资源,则用这个key的value来作为默认
Executaule file CFBundleExecutable 程序安装包的名称
Bundle name CFBundleDisplayName 设置程序安装后显示的名称。应用程序名称限制在10-12个字符,如果超出,将被显示缩写名称
Bundle identifier CFBundleIdentifier APP的唯一标识字符串。
InfoDictionary version CFBundleInfoDictionaryVersion  Info.plist格式的版本信息
Bundle OS Type code CFBundlePackageType  用来标识束类型的四个字母长的代码(目前没用到过,还不清楚怎么用)
Bundle versions string, short CFBundleShortVersionString 版本字符串(版本号)
Bundle version CFBundleVersion 构建版本号,每次上传之后需要增加
Application require iPhone environment LSRequiresIPhoneOS:用于指示程序包是否只能运行在iPhone OS 系统上。Xcode自动加入这个键,并将它的值设置为true。您不应该改变这个键的值。
supported interface orientations UISupportedInterfaceOrientations 程序默认支持的方向。

APP的状态:

Not running ( 未运行 ): 程序没启动

Inactive ( 未激活 ): 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。

Active ( 激活 ): 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。

Backgroud ( 后台 ): 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。

Suspended ( 挂起 ): 程序在后台但是却不能执行代码。系统会自动把程序变成这个状态而且不会发出通知
当挂起时,程序还是停留内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

APPdelegate中状态改变调用的方法:

// 程序 开始运行- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.return YES;}// 程序 挂起(有电话进来 或者 锁屏(拉下状态栏、双击Home键使App界面上移) 的时候)- (void)applicationWillResignActive:(UIApplication *)application {}// 程序 进入后台- (void)applicationDidEnterBackground:(UIApplication *)application {}// 程序 进入前台- (void)applicationWillEnterForeground:(UIApplication *)application {}// 程序 重新激活(复原)注意:应用程序在启动时,在调用了“applicationDidFinishLaunching”方法之后 同样也会 调用“applicationDidBecomeActive”方法!- (void)applicationDidBecomeActive:(UIApplication *)application {}// 程序 终止(注:如果点击主按钮强制退出,则不会调用该方法。)- (void)applicationWillTerminate:(UIApplication *)application {}

实际使用中碰到的几个场景:

  • “点击桌面图标,正常启动App” 或者 “杀死进程后点击推送消息,启动App” :
    1.application:willFinishLaunchingWithOptions
    2.application:application:didFinishLaunchingWithOptions
    3.applicationDidBecomeActive
    4.application:didRegisterForRemoteNotificationsWithDeviceToken // 接收、处理消息通知
  • 拖下通知中心/双击Home键,使App界面上移
    applicationWillResignActive
  • 拖上通知中心/再双击Home键,使App界面恢复原位
    applicationDidBecomeActive
  • 按Home键,使App 进入后台
    1.applicationWillResignActive
    2.applicationDidEnterBackground
  • 点击App图标,使App从后台 恢复至前台
    1.applicationWillEnterForeground
    2.applicationDidBecomeActive
  • 点击通知中心里面的远程推送,使App从后台 进入前台
    1.applicationWillEnterForeground
    2.application:didReceiveRemoteNotification // 接收、处理消息通知
    3.applicationDidBecomeActive
  • 上滑 或者 按住App图标,选择减号图标,杀死App进程(终止程序)
    applicationWillTerminate
  • 从APP切换到微信之类的其他应用之后,再切换回来
    1.applicationWillEnterForeground
    2.application:openURL:sourceApplication // 应用间⭐️传值⭐️
    3.applicationDidBecomeActive

转载于:https://my.oschina.net/yejiexiaobai/blog/2878567

APP启动原理,APPdelegate程序状态解析相关推荐

  1. Android 系统性能优化(21)---App启动原理分析及启动时间优化

    一.启动原理解析 Android是基于Linux内核的,当手机启动,加载完Linux内核后,会由Linux系统的init祖先进程fork出Zygote进程,所有的Android应用程序进程以及系统服务 ...

  2. Android启动过程五个步骤,Android启动流程、app启动原理

    从头分析整理学习底层知识. Android 众多基于Linux内核的系统类似, 启动系统时, bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进 ...

  3. Spring Boot:(二)启动原理解析

    Spring Boot:(二)启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏. ...

  4. Spring Boot(18)---启动原理解析

    Spring Boot(18)---启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会 ...

  5. Android开发——解析App启动页(Splash)黑/白闪屏现象

    前言 我在开发App的时候,出现App在启动会出现短暂的黑/白闪屏现象.这样现象对用户的体验感是会产生不好的影响,于是我就研究这个现象的起因和解决办法.不负有心人,我在翻了很多博客,踩完坑之后找到起因 ...

  6. 4、Eureka 源码解析 之 Eureka Client 启动原理分析

    在前面的一篇文章 3.Eureka 源码解析 之 Eureka Server 启动原理分析当中我们分析了一下 Eureka Server 的启动.在集群环境下 Eureka Server 相互之前需要 ...

  7. iOS App 启动性能优化

    为什么80%的码农都做不了架构师?>>>    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq. ...

  8. iOS中的应用启动原理

    iOS中的应用启动原理 来源: http://m.blog.csdn.net/article/details?id=50530090  http://m.warting.com/program/201 ...

  9. iOS程序启动原理(上)

    为什么80%的码农都做不了架构师?>>>    iOS程序启动原理 Info.plist 常见设置 建立一个工程后,会在Supporting files文件夹下看到一个"工 ...

最新文章

  1. 如何检查文件是否是python中的目录或常规文件? [重复]
  2. Java Web文件下载
  3. 查看oracle数据库的连接情况
  4. Mysql 大量数据快速导出
  5. Android-两种方式实现走马灯效果
  6. 视频教程-【深入理解计算机网络】讲师解读计算机网络原理视频课程(下)-计算机网络
  7. Windows 10 微软拼音输入法无法输入中文标点符号
  8. 非参数统计的Python实现——卡方独立性检验
  9. Six提供了Python 2和Python 3的兼容库
  10. 消息队列KafKa的集群部署
  11. 2021年中国银行间同业拆借成交额及加权平均利率分析:成交额、同业拆借及质押式回购加权平均利率均呈增长趋势[图]
  12. 操作系统学习笔记:保护
  13. 如何读懂交易伙伴的EDI需求
  14. 正态分布在项目工期预期概率中的考点及其它领域的应用
  15. 外卖跑腿小程序APP定制开发扫码点餐配送
  16. C++题目分享之冰雹猜想
  17. 谨以此文致敬每一位前端开发者
  18. Flutter实现3D效果,一个字,炫!
  19. WIN11如何打开应用卸载中心?
  20. 小程序 微信统计表格_微信小程序简单的数据表格及查询功能

热门文章

  1. 用python实现的抓取腾讯视频所有电影的爬虫
  2. 新的一年你该如何起飞
  3. Jquery 常用方法经典总结
  4. Windows 2008下安装配置 WDS Windows部署服务
  5. 汇总c#.net常用函数和方法集
  6. 数据库的查询,添加,修改,删除
  7. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
  8. 逃离湾区,下一站是哪里?西雅图 PK 奥斯汀
  9. git 服务器自动部署项目之GitHooks
  10. 阻止应用继承的NTFS权限