【框架】App运行过程解析

原创 2016年06月01日 18:53:15
支持原创,更多内容请移步:
http://www.china10s.com/blog/?p=290

编写程序,最终要的就是,要知道程序从何处开始,从何处结束,中间过程的状态转换又是如何进行的。只有知道这些,才能在出现问题时候立马能发现问题的根本,迅速找出问题所在。
iOS程序启动,和其他基于C的程序一样,都有一个main方法,现在我们就来看看。

App启动过程:

int main(int argc, char * argv[]) {
   
@autoreleasepool {
       
returnUIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegateclass]));
    }
}

这个main方法中,首先启动了一个 autoreleasepool ,这个是在最顶部的自动释放池。

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
UIKIT_EXTERNint UIApplicationMain(int argc,char *argv[],NSString *__nullable principalClassName,NSString *__nullable delegateClassName);

进入这个 UIApplicationMain 函数定义,可以看到由于我们在 NSPrincipalClass 这个函数传递了nil,于是 UIApplicationDelegate 才得以起作用。我们也可以在 NSPrincipalClass 参数位置传递自定义的 UIApplication。
这个 UIApplicationMain 函数内部实现了:
1、用 StoryBoard 载入用户界面。
2、调用传入的 UIApplicationDelegate 的钩子方法来做一些程序加载之前的初始化操作。
3、将我们的App加入到程序 Main Run Loop 中,来响应和处理用户交互信息。

在启动过程中,会涉及到如下一些重要的角色:

UIApplication:
用来处理用户与设备交互的事件,并将其转发给对应的target object来处理。是整个App的核心调度模块。

UIApplicationDelegate:
只用来处理一些与整个App(而不是单个View)有关的事件。比如程序的启动加载、远程消息推送、App切换、App切回、App内存不足等事件。

CALayer:
属于 Core Animation 框架中的一个类,所有的控件和自绘制图形都是基于此类。

UIView:
开发人员使用最多的一个类。一般是使用其子类,绘制各种各样的图形。其中包含一个layer属性,所有内容都要在这个layer上绘制。当你发现 UIKit 框架提供的基本控件不能满足你的要求时,可以采用在 drawRect 函数中绘制,或者直接在 layer 属性上进行绘制。

UIWindow
继承自UIView,属于程序的顶层UIView,是一个基本容器,不显示内容。
由于继承自UIResponder,所以能够响应用户事件。

UIViewControl:
控制UIView的显示过程,接收事件,例如内存警告等。其中包含一个主UIView,所有的内容都在这个view或者其subview上绘制。


在程序启动过程中,会首先拉起一个 Main run loop 。相当于是这个 App 进程内的一个 while 循环,一直在后台运行。当有事件发生时候,操作系统首先会将事件通过对应的端口,放置到事件队列当中。App 的 Main run loop 就会获取到这个事件,并将其发送给 UIApplication ,由它来确定将事件发送给哪个对象。可以查阅事件分发规则:https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/Introduction/Introduction.html





App状态切换:
Not Running
程序未运行状态,程序没有启动。

Inactive
程序启动了,但还不能接收各种消息事件。

Active
程序在前台正常运行。

Background
这个状态可以接受消息。程序被切换到后台,会停留在这个状态一段时间,时间到之后,会被切换到Suspended状态挂起。

Suspended
程序被挂起,不能接收消息。在iOS系统内存过低时候,会将该状态的程序清除掉。下次再打开就相当于重新开启的状态。



接下来看看 UIApplicationDelegate 中的几个函数所对应的状态:

程序完成加载,此时处于Inactive 的状态。即将由 Inactive 进入 Active 状态。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
// Override point for customization after application launch.
   
returnYES;
}

程序已经进入 Active 状态。
- (void)applicationDidBecomeActive:(UIApplication *)application {
   
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

程序即将由 Active 进入 Inactive 状态。
- (void)applicationWillResignActive:(UIApplication *)application {
   
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
   
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

程序切换到后台,进入 Background 状态。
如果你的程序有一些需要在后台继续执行的功能,就需要在这个函数中进行处理了。
- (void)applicationDidEnterBackground:(UIApplication *)application {
   
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
   
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

程序即将从后台被唤醒,进入前台。即进入 Active 状态。
- (void)applicationWillEnterForeground:(UIApplication *)application {
   
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

程序即将被关闭时候调用。
- (void)applicationWillTerminate:(UIApplication *)application {
   
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

最后用几张图片来直观的解释各个状态之间的切换过程:

程序启动:


程序被人为中断:


程序切换走:


程序切换回来:


锁屏:



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

app在android 6.0或以上平台版本运行过程中请求权限

从android 6.0(API 23)开始,安装app时不需要对app的权限申请进行授权,而是在app运行的时候,用户才需要对app进行授权。这种流程精简了app的安装过程,用户不需要在安装或者升级...

解密所有APP运行过程中的内部逻辑

1. 前言       这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI、dex2jar等等等等已经...

运行APP时dex2oat过程中DumpLIRInsn函数出错

运行APP时dex2oat过程中DumpLIRInsn函数出错,段错误SIGSEGV日志如下: 03-17 11:36:58.403  2169  2169 I dex2oat : HXM lir-...

解密所有APP运行过程中的内部逻辑

0×01前言 这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI、dex2jar等已经无法...

利用fragment搭建最常用的app tab框架达到切换过程中状态的保存

几乎所有的app开发中都会采用如下图所示的结构,就是上面是主要显示的内容,下面是几个tab,点击这些tab可以切换上面显示的内容,并且各个标签页的状态是可以保持的,例如第一个标签页中的列表滑到中间位置...
  • erjizi
  • erjizi
  • 2015-11-24 09:34
  • 1437

Hama框架学习(一) 从源码角度分析job的提交和运行过程

虽然之前知道Hama的运行机制,但是只是理论上的理解,最近几天从源码出发对Hama的job提交和运行过程进行了学习,对Hama的整体框架有了更深刻的认识。

BSP-Apache.HAMA运行过程(框架)

BSP-HAMA运行过程 Hama-architecture Apache-hama集群是以BSP为框架为基础由一个BSPMaster、(多个)互不关联的GroomServer计算结点、可独立运...

上层APP调用底层硬件驱动过程解析

APP应用程序->应用框架层->硬件抽象层-> 硬件驱动程序 一、硬件驱动层             进入kernel/drivers文件夹中,创建一文件夹,放...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)