首页 > 其他分享 >ios生命周期整理

ios生命周期整理

时间:2023-06-22 11:33:24浏览次数:58  
标签:状态 生命周期 启动 ios Application UI 前台 应用 整理

ios App states  应用的五种状态

State

 描述

 Not running     

 

       应用没有被启动;或者应用正在运行但是途中被系统终止了。

 Inactive

 

       应用在前台运行,但是还不能接收事件(当时或许正在执行其他代码);一个应用通常只是很短时间停留在这个状态,很快它将切换到一个不同的状态;
       唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。 

 Active

 

       应用在前台运行,并能接收事件;这是前台应用的正常状态;

 Background 

 

       应用正在后台执行;大多数应用进入这种状态的时间很短暂;一个应用如何请求了额外的执行时间,可以保持这个状态一段时间;
       直接启动应用进入后台也是进入的这个状态;如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态。比如没有界面的应用。注此处并不特指没有界面的应用,其实也可以是有界面的应用,只是如果要直接进入background状态的话,该应用界面不会被显示。没有权限使用某个应用,或者企业级应用签名过期,或者开发测试应用签名过期都会是这样的情况。

 Suspended

 

       应用在后台,不执行;应用仍在内存中,但是不执行;这种状态是自动进入的,不会收到任何通知;当内存过低时,系统会清除这个状态的应用。

 

这几种状态的装换流程图如下:

ios生命周期整理_ios

注意:

1、运行在ios3.2或更早版本操作系统上的应用并不进入 background 和 suspended 状态, 另外一些即使运行在 ios 4或更高版本的应用,由于不支持多任务或后台执行,也不会进入background和suspended状态。相应的这些应用在前台运行状态离开时就会直接被终止。

状态变化时,我们可以通过继承下面方法来响应状态的转换。

方法名

简介

application:didFinishLaunchingWithOptions 

  这是程序启动时调用的函数。可以在此方法中加入初始化相关的代码。

applicationDidBecomeActive

  应用在准备进入前台运行时执行的函数。(当应用从启动到前台,或从后台转入前台都会调用此方法)

applicationWillResignActive

  应用当前正要从前台运行状态离开时执行的函数。

applicationDidEnterBackground

  此时应用处在background状态,并且没有执行任何代码,未来将被挂起进入suspended状态。

applicationWillEnterForeground

  当前应用正从后台移入前台运行状态,但是当前还没有到Active状态时执行的函数。

applicationWillTerminate

  当前应用即将被终止,在终止前调用的函数。如果应用当前处在suspended状态,此方法不会被调用。

 

关于main函数,UIApplication类和UIApplication代理类

每一个iPhone程序都包含一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

在main函数中UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));对UIApplication对象进行了初始化,这个对象是隐含的,这个方法除了argc 和 argv 参数外,另外这个函数还有两个字符串参数来识别UI Application类和UI Application代理类,

第一个参数为nil就默认把UI Application类作为缺省值进行初始化,可以在这里不填nil而是使用自己定义的UI Application子类。

至于第二个参数,这里有了UI Application对象怎么又出来一个UI Application代理类对象呢?这里需要说明UI Application对象说是管理整个程序的生命周期其实它是什么具体的事情都不干,它只负责监听事件当需要做实际工作的时候就交给UI Application代理类去做,UI Application相当于传令官负责只把命令传达给UI Application代理类这个士兵,然后由这个士兵真正去冲锋陷阵,所以需要给UI Application对象设置代理类。

 

两种启动的流程:

最常见的应用启动后,进入前台的流程

ios生命周期整理_ios_02

应用启动后进入后台运行状态

ios生命周期整理_代理类_03

 

 

   为了在程序中确定你的程序是进入到了foreground还是background,你可以在application:didFinishLaunchingWithOptions:   方法中检测UIApplication类对象的applicationState属性,如果应用进入到了foreground,则属性值为UIApplicationStateInactive,如果进入到了background,则为UIApplicationStateBackground。

检测示例代码:

UIApplicationState state = [UIApplication sharedApplication].applicationState;
  return (state==UIApplicationStateActive || state==UIApplicationStateInactive );

ios生命周期整理_UI_04

注意点一:应用启动方式:

两种其中方式:点击应用图标或者从其他应用启动本应用(URL方式)

从其他应用启动本应用方式比较常见的:

  • 调用Google地图
  • 调用邮件客户端
  • 拨号
  • 调用短信
  • 调用浏览器
  • 调用应用商店
  • 当然我们也可以直接在safari浏览器中输入对应URL来启动应用; 

如果应用是通过URL启动,且之前应用没有启动,则会是下面的流程:

ios生命周期整理_ios_05

 

如果应用是URL方式启动,且之前一直在内存中,则是下面的流程启动:

ios生命周期整理_代理类_06

 

响应中断

当一个基于警告的中断(诸如电话来电)发生时,应用会暂时从active状态切换到Inactive状态,以给系统提供机会提示用户,让用户决定如何处理。在用户决定如何处理此中断警告之前,应用将一直处于Inactive状态。 在用户做出选择后,当前应用或者回到active状态继续运行,或者直接切换到background状态以让位于其它的应用运行。此种情况下,应用执行流程如下图所示:

ios生命周期整理_ios_07

 

 

切向后台 background 状态

当用户按下"Home"键或者系统启动另外一个应用时,前台foreground应用首先切换到Inactive状态,然后切换到Background状态。

ios生命周期整理_UI_08

 

 

 

应用从后台返回前台:

如果应用曾被移入后台,相应的任务被停止,则此时返回前台时可以重启任务继续执行。

ios生命周期整理_ios_09

 

 

 

参考资料:

ios App States and Multitasking

这篇文章的中文版
http://linwwwei.iteye.com/blog/1434360 

多线程的ios生命周期
http://www.cocoanetics.com/files/UIApplicationDelegate5.pdf

Understanding iOS 4 Backgrounding and Delegate Messaging
http://www.cocoanetics.com/2010/07/understanding-ios-4-backgrounding-and-delegate-messaging/

[iOS]深入浅出 iOS 之生命周期

标签:状态,生命周期,启动,ios,Application,UI,前台,应用,整理
From: https://blog.51cto.com/u_15588078/6534485

相关文章

  • iOS 应用是如何创建的
    iOSapplifecycle生命周期图 第一步:Main有C相关语言开发经验的朋友都知道,所有程序运行都是从main程序开始的。#import<UIKit/UIKit.h>#import"NoteNavAppDelegate.h"intmain(intargc,char*argv[]){@autoreleasepool{returnUIApplicationMain(arg......
  • 字节总监用了半个月整理出的1595页《Android11.0 最新Framework解析》高清PDF开发下载
    作为过来人,发现很多学习者和实践者都在AndroidFramework上面临着很多的困扰,比如:工作场景中遇到难题,往往只能靠盲猜和感觉,用临时性的补救措施去掩盖,看似解决了问题,但下次同样的问题又会发作,原因则是缺乏方法论、思路的指引以及工具支持;能力修炼中,缺乏互联网项目这一实践环境,对Fram......
  • vue+axios实现token无感刷新
    原文出处:https://www.jb51.net/javascript/286094r4h.htm 通常,对于一些需要记录用户行为的系统,在进行网络请求的时候都会要求传递一下登录的token。不过,为了接口数据的安全,服务器的token一般不会设置太长,根据需要一般是1-7天的样子,token过期后就需要重新登录。不过,频繁的登录会......
  • 收集整理的对#!bin/sh的认识
    第一次学shell编程,看的文章中说shell程序必须以"#!/bin/sh"开始,也就认为是这样了。虽然知道在shell中以"#"开始的语句都是注释,但也从没认为"#!/bin/sh"也是注释,就像对C语言程序必须有main函数一样毫无怀疑。但前些时候又听说"#!/bin/sh"也是注释,可有可无,当时觉得真是一个失败,连......
  • mmseg4j 中文分词器的一些简介整理
    在lucene中,我们是使用IndexWriter调用Analyzer将文章切成以词为单位的Stream,然后生成索引的。lucene内建的分词器很多,比如:按空白字符分词的WhitespaceAnalyzer,添加了stopword过滤的StopAnalyzer,以及最常用的是StandardAnalyzer。这些自带的分词器对中文支持多不好,我觉得比......
  • 项目经历整理
    基于视觉安全的图像加密系统1.图像加密研究置乱加密:Arnold变换:Arnold变换是俄国数学家提出的一种变化,一副N×N的数字图像的二维Arnold变换定义为:注意,需要保证|ad-bc|=1,例如a=b=1,置换次数n=20,则他们被当成密钥key,用于解密。Arnol变换是N*N的图片首先,在二维等长方面......
  • 深度学习一些亟待研究问题整理
    亟待研究的一些问题自己整理的问题:1.深度结构是如何对输入进行表达的。2.寻找更好的输入特征向量(需要提取的特征)和更好的深度组合结构;3.比较降噪编码器和RBM在预训练和微调时,预测能力的差别,分析产生的原因。4.分析RBM在无监督训练时如何提取输入数据的特征。5.进一步探索新的网络拓......
  • MySQL笔记整理
    SELECT0+'123.00';SELECT0+'123.0qwe';SELECT0+'qwe1';SELECT0+null;SELECT'123.00'/4;SELECT'123.0qwe'/4;SELECT'qwe1'/4;SELECT'1qwe'/4;SELECTnull/4;SELECTconvert(......
  • iOS开发笔记 - Objective-C和JavaScript的混编
    最近看了一个对Github上面编程语言使用统计的排行榜,JavaScript真可以说是一枝独秀,很难想象20年前,这个语言只是浏览器中的装饰性语言,能做的事情也就是一点特效或者检查一下要提交给服务器的表单是否满足要求。今天的JavaScript已经是一个全栈语言,从客户端到服务器无所不在。很多编程......
  • iOS开发笔记 - 语言篇之Swift
     2014年的苹果全球开发者大会(WWDC),当CraigFederighi向全世界宣布“Wehavenewprogramminglanguage”(我们有了新的编程语言)的时候,全场响起了最热烈和持久的掌声,伴随着掌声到来的语言叫Swift。接下来CraigFederighi更是毫不掩饰的告诉大家,Swift将成为主宰iOS和Mac开发的新语言,甚......