iOS程序生命周期流程

盛年不重来,一日难再晨。及时宜自勉,岁月不待人。

  iOS系统资源是有限的,合理的去配置应用程序的运行状态以及了解app的生命周期对于大多数开发者来说是很重要的一件事情!在后台进行运行时app会受到系统的很多限制,但是也可以提高电池的使用和用户的体验。

1. 应用程序的运行状态

1.1)运行状态

  1. Not running 未运行状态,程序并没有进行启动时的状态;
  2. Inactive 未激活状态 ,程序在前台运行,但没有接收到任何事件。在程序没有事件需要处理时停留在这个状态,相当于程序休眠;
  3. Active 激活状态,程序在前台运行而且接受到事件,并对事件进行响应和处理。这也是前台的一个重要的状态;
  4. Background 后台状态,处于运行中的应用程序切换到后台时的状态,会在此状态保留一定时间,时间超过时就会进入应用程序的挂起状态,有的应用程序也可以根据需求使其长期进入后台状态;
  5. Suspended 挂起状态,此状态也是一种后台状态,于background的不同在于挂起状态的应用程序是不可以执行代码的,其特点是程序还是停留在内存中,当出现内存警告时iOS系统会首先把挂起的程序清除出内存并为处于前台运行状态的应用程序提供内存;

  下面是程序运行状态的变化图

image

1.2)运行状态的代理回调方法

//程序即将启动完成
//对应未启动状态,告诉代理程序已经进入启动状态但是还没有进入未激活状态
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    return YES;
}

//程序启动完成
//对应已经启动状态,准备进入前台开始运行状态,当没有接收到事件时则表示的是未激活状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return YES;
}

//应用程序进入激活状态,应用程序可以接受事件并对其进行处
-(void)applicationDidBecomeActive:(UIApplication *)application{
    
}

//应用程序放弃了活动状态进入未激活状态,在此状态中应用程序无法接受事件进行处理
-(void)applicationWillResignActive:(UIApplication *)application{
    
}

//应用程序进入后台,在后台继续执行的代码在此可以进行处理即可
- (void)applicationDidEnterBackground:(UIApplication *)application {

}

//应用程序将要进入前台,包含两个状态未激活和激活状态
-(void)applicationWillEnterForeground:(UIApplication *)application{
    
}

//程序将要终止退出,用来保存一些数据和转状态,以及应用程序退出前的内存清理工作
-(void)applicationWillTerminate:(UIApplication *)application{
    
}

// 应用程序完成载入
- (void)applicationDidFinishLaunching:(UIApplication*)application{
  
}

  有了这些回调,程序员就能很容易地捕捉应用程序当前的状态,从而做出处理。值得一提的是,在实际开发中,将所有的程序状态都放在AppDelegate中处理,并不是很方便。所以,也可以通过监听通知,获取到当前的程序状态。

UIKIT_EXTERN NSNotificationName const UIApplicationDidEnterBackgroundNotification       NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN NSNotificationName const UIApplicationWillEnterForegroundNotification      NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN NSNotificationName const UIApplicationDidFinishLaunchingNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationDidBecomeActiveNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationWillResignActiveNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationWillTerminateNotification;

2. 应用程序的生命周期

2.1)加载进入前台的生命周期

image

  应用程序进入前台的生命周期从图中可以看出包括启动时间,应用程序进入运行的时间,以及切换不同app时的时间。

  应用程序的启动时间:从图中可以看出,应用程序的启动时间从我们触发app开始,然后到main函数执行,到加载mainUI文件,到第一次加载完成以及加载其他UI完成的时间并进入未激活状态所用的时间就是启动app时的启动时间

  其代理方法的调用时间:

// 在第一次完成加载mainUI时进行加载
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// 在完全加载成功UI时进入此方法通知app完成启动进入未激活状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

// 在应用程序处于运行状态时接受到事件时通知app进入激活状态
- (void)applicationDidBecomeActive:(UIApplication *)application  

2.2)加载进入后台的生命周期

image

  从上图可以看出,当应用程序启动后,进入后台时会有一个判断是否可以在后台运行,允许后台运行时会一直处于后台运行状态并执行某些代码操作,当不允许运行时会进入到挂起状态不可执行任何代码操作。当我们在返回前台运行时会通过代理方法通知app程序的运行状态从后台变为前台的未激活状态和激活状态。

posted @ 2021-10-14 19:54  背包の技术  阅读(185)  评论(0编辑  收藏  举报