iOS应用的生命周期

一、AppDelegate详细介绍:

每个iPhone应用程序都有一个UIApplication,UIApplication是iPhone应用程序的开始并且负责初始化并显示 UIWindow,并负责加载应用程序的第一个UIView到UIWindow窗体中。UIApplication的另一个任务是帮助管理应用程序的 生命 周期,而UIApplication通过一个名字为UIApplicationDelegate的代理类来履行这个任务。尽管 UIApplication 会负责接收事件,而UIApplicationDelegate则决定应用程序如何去响应这些事 件,UIApplicationDelegate可以处理 的事件包括应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警 告),本文会介绍如何加载应用程序的UIView到 UIWindow以及如何利用UIApplicationDelegate处理系统事件。

  • iOS13之前,AppDelegate的职责全权处理App生命周期和UI生命周期;
  • iOS13之后,AppDelegate的职责是:
  1. 处理App生命周期;
  2. 新的Scene Session生命周期,UI的生命周期交给新增的Scene Delegate处理
二、应用程序的生命周期介绍:
1.应用程序的状态:
  • Not running:未运行,程序没有启动。

  • Inactive:未激活,程序在前台运行,但没有接收到任何事件,或被其他任务强制占用了,例如突然来了电话、程序在前台时手机自动锁屏等。在没有事件处理情况下程序通常停留在这个状态。

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

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

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChHg12ht-1641890651119)(/Users/yichen/Library/Application Support/typora-user-images/image-20211224134019851.png)]

2.AppDelegate中的一些方法

(1)willFinishLaunching

//willFinishLaunching:程序将要完成启动。只在程序启动时执行一次。launchOptions:存存储程序启动的原因。
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return YES;
}

(2) didFinishLaunching:

didFinishLaunching是在app显示界面给用户之前最后执行的状态,理所当然我们可以在这个方法内完成一些基本的初始化,但是应该是轻量级的初始化操作,不然会导致程序启动时间长。

//didFinishLaunching是在app显示界面给用户之前最后执行的状态,理所当然我们可以在这个方法内完成一些基本的初始化,但是应该是轻量级的初始化操作,不然会导致程序启动时间长,影响用户体验。
//例如:
//不使用StoryBoard,需要配置window
//第三方登录sdk注册,以及很多第三方sdk的初始化配置
//判断程序接下来的业务逻辑,播不播放引导图片?播不播放开屏广告?有没有登录?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //若用户直接启动,launchOptions内无数据。
 
    //若由其他程序通过openURL:启动。
    //launchOptions中UIApplicationLaunchOptionsURLKey的数据为openURL:的参数url。
    //launchOptions中UIApplicationLaunchOptionsSourceApplicationKey的数据为启动本程序的源程序的bundle ID(NSString)。
    NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    if (url) {
        [self launchOptionsWithURL:url];
    }
    
    NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
    if (bundleId) {
        [self launchOptionsWithBundleId:bundleId];
    }
    //若由远程通知启动。
    //launchOptions中UIApplicationLaunchOptionsRemoteNotificationKey对应数据为启动本程序的远程通知信息useinfo(NSDictionary)。
    NSDictionary *useinfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (useinfo) {
        [self launchOptionsWithUseinfo:useinfo];
    }
    
    return YES;
}

(3) DidBecomeActive:

DidBecomeActive:程序已激活。程序在处于前台时调用:程序第一次启动时、从后台返回前台时。

若程序之前在后台,可以在这方法内重新拉取数据,刷新用户界面。

//程序第一次启动,从后台到前台时调用。
- (void)applicationDidBecomeActive:(UIApplication *)application {
    //程序进入前台时,记录当前时间
    
}

(4) WillResignActive:

WillResignActive:程序将要进入未激活。程序在处于前台时调用:有电话打进来、手机锁屏等。程序被其他任务强制占用了,就会调用这个方法,此方法也称之为中断方法。

- (void)applicationWillResignActive:(UIApplication *)application{
    //程序准备进入后台通知相关VC 记录当前时间
}

(5) DidEnterBackground

作用是:

  • 释放共享资源
  • 保存用户数据(写到硬盘)
  • 作废计时器
  • 保存足够的程序状态以便下次恢复
//程序已经进入后台时调用
- (void)applicationDidEnterBackground:(UIApplication *)application {
	//
}

**(6)WillEnterForeground **:

WillEnterForeground:程序将要进入前台。程序从后台进入前台时调用。WillEnterForeground主要用于撤销WillResignActive中做的操作。

//程序将要进入前台。程序从后台进入前台时调用。
-(void)applicationWillEnterForeground:(UIApplication *)application {

}

(7)WillTerminate:

WillTerminate:程序将要终止。程序终止之前调用。

//目的就是为了保留一些重要的数据,方便下次启动后的恢复,达到一种让用户感觉该程序永远运行在后台从来没被终止过的感觉
- (void)applicationWillTerminate:(UIApplication *)application{
  
}
3.交互的时间段及先后顺序

启动程序:

  • willFinishLaunchingWithOptions:只在程序启动时调用一次。
  • didFinishLaunchingWithOptions:程序已经完成启动,将要显示界面了。只在程序启动时执行一次。
  • DidBecomeActive:程序在处于前台时调用:程序第一次启动时、从后台返回前台时。

前台进入后台

  • WillResignActive:程序将要进入未激活。程序在处于前台时调用:有电话打进来、手机锁屏等。程序被其他任务强制占用了,就会调用这个方法,所以这个方法也称为程序中断调用方法。
  • DidEnterBackground:程序已经进入后台。程序从前台进入后台时调用。

后台进入前台

  • WillEnterForeground:程序将要进入前台。程序从后台进入前台时调用。
  • DidBecomeActive:从后台返回前台时调用。

终止程序

  • WillTerminate:程序将要终止。程序终止之前调用。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
UniApp 是一种跨平台的应用开发框架,它基于 Vue.js 和微信小程序开发框架,可以同时在多个平台上运行,包括 iOS、Android、H5 等。UniApp应用生命周期与 Vue.js 的生命周期类似,同时也包含了一些特定于 UniApp生命周期事件。 下面是 UniApp 应用的主要生命周期: 1. beforeCreate: 在实例初始化之后,数据观测 (data observer) 和事件配置 (event/watch) 之前被调用。 2. created: 实例已经创建完成之后被调用。在这个阶段,实例已经完成数据观测、属性和方法的运算,但是还没有开始 DOM 编译和挂载。 3. beforeMount: 在挂载开始之前被调用。在这个阶段,模板编译已经完成,但是还没有开始将模板渲染成真实的 DOM。 4. mounted: 在挂载完成之后被调用。在这个阶段,实例已经完成了模板的编译和 DOM 的挂载,可以访问到挂载后的 DOM 元素。 5. beforeUpdate: 在组件更新之前被调用。在这个阶段,数据变化导致的虚拟 DOM 重新渲染之前执行一些逻辑操作。 6. updated: 在组件更新之后被调用。在这个阶段,虚拟 DOM 已经重新渲染,并且 DOM 已经更新完成。 7. beforeDestroy: 在实例销毁之前被调用。在这个阶段,实例仍然完全可用。 8. destroyed: 在实例销毁之后被调用。在这个阶段,实例已经被销毁,所有的事件监听器和子组件都已经被移除。 此外,UniApp 还提供了一些特定于平台的生命周期事件,如小程序平台的 onLaunch、onShow、onHide 等。开发者可以使用这些生命周期事件来控制应用的初始化、页面切换、数据更新等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值