OOM问题原理解析(三):生命周期相关问题总结,阿里大牛教你自己写Android第三方库

  • Not Running:未运行。

  • Inactive:前台非活动状态。处于前台,但是不能接受事件处理。

  • Active:前台活动状态。处于前台,能接受事件处理。

  • Background:后台状态。进入后台,如果又可执行代码,会执行代码,代码执行完毕,程序进行挂起。

  • Suspended:挂起状态。进入后台,不能执行代码,如果内存不足,程序会被杀死。

AppDelegate中的回调方法和通知
  1. 回调方法:application:didFinishLaunchingWithOptions:

本地通知:UIApplicationDidFinishLaunchingNotification

触发时机:程序启动并进行初始化的时候后。

适宜操作:这个阶段应该进行根视图的创建。

  1. 回调方法:applicationDidBecomeActive:

本地通知:UIApplicationDidBecomeActiveNotification

触发时机:程序进入前台并处于活动状态时调用。

适宜操作:这个阶段应该恢复UI状态(例如游戏状态)。

  1. 回调方法:applicationWillResignActive:

本地通知:UIApplicationWillResignActiveNotification

触发时机:从活动状态进入非活动状态。

适宜操作:这个阶段应该保存UI状态(例如游戏状态)。

  1. 回调方法:applicationDidEnterBackground:

本地通知:UIApplicationDidEnterBackgroundNotification

触发时机:程序进入后台时调用。

适宜操作:这个阶段应该保存用户数据,释放一些资源(例如释放数据库资源)。

  1. 回调方法:applicationWillEnterForeground:

本地通知:UIApplicationWillEnterForegroundNotification

触发时机:程序进入前台,但是还没有处于活动状态时调用。

适宜操作:这个阶段应该恢复用户数据。

  1. 回调方法:applicationWillTerminate:

本地通知:UIApplicationWillTerminateNotification

触发时机:程序被杀死时调用。

适宜操作:这个阶段应该进行释放一些资源和保存用户数据。

程序周期相关操作
  1. 程序启动

点击应用图标时,会经历三个状态:

Not running–>Inactive–>Active

Not running --> Inactive

调用 application:didFinishLaunchingWithOptions: 发送 UIApplicationDidFinishLaunchingNotification

Inactive–>Active

调用 applicationDidBecomeActive: 发送:UIApplicationDidBecomeActiveNotification

  1. 程序点击Home(双击home后台运行)

根据info.plist中Application does not run in background / UIApplicationExitsOnSuspend控制似乎否可以在后台运行或挂起。

如果可以在后台运行或者挂起会经历

Active–>Inactive–>Background–>Suspended

Active–>Inactive

调用 applicationWillResignActive: 发送:UIApplicationWillResignActiveNotification

Background–>Suspended

调用 applicationDidEnterBackground: 发送:UIApplicationDidEnterBackgroundNotification

如果不可以后台运行或挂起会经历

Active–>Inactive–>Background–>Suspended–>Not Running

Background–>Suspended

调用 applicationDidEnterBackground: 发送:UIApplicationDidEnterBackgroundNotification

Suspended–>Not Running

调用 applicationWillTerminate: 发送:UIApplicationWillTerminateNotification

  1. 挂起后,重新运行

Suspended–>Background–>Inactive–>Active

Background–>Inactive

调用 applicationWillEnterForeground: 发送:UIApplicationWillEnterForegroundNotification

Inactive–>Active

调用 applicationDidBecomeActive: 发送:UIApplicationDidBecomeActiveNotification

  1. 内存不足,杀死程序

Background–>Suspended–>Not running

这种情况不会调用任何方法,也不会发送任何通知。

二、UIViewController的生命周期

==================================================================================

下面是UIViewController生命的相关方法(注意顺序)

//类的初始化方法,并不是每次创建对象都调用,只有这个类第一次创建对象才会调用,做一些类的准备工

作,再次创建这个类的对象。initialize方法将不会被调用,对于这个类的子类,如果实现了initialize

方法,在这个子类第一次创建对象是会调用自己的initialization方法,没有实现者由调用父类实现方

法;可以用以实现相关全局变量

  • (void)initialize;

//对象初始化方法init方法和initCoder方法相似,只是被调用的环境不一样,如果用代码进行初始化,会

调用init,从nib文件或者归档进行初始化,会调用initCoder。

  • (instancetype)init;

//从归档初始化

  • (instancetype)initWithCoder:(NSCoder *)coder;

//加载视图:是开始加载视图的起始方法,除非手动调用,否则在viewcontroller的生命周期中没特殊情况

只被调用一次;ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的

getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来

创建view。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时

view以及创建好了。

-(void)loadView;

//将要加载视图:,类中成员对象和变量的初始化我们都会放在这个方法中,在类创建后,无论视图的展现或消失,这个方法也是只会在将要布局时调用一次。

  • (void)viewDidLoad;

//将要展示

-(void)viewWillAppear:(BOOL)animated;

//将要布局子视图,在viewWillAppear后调用,将要对子视图进行布局。

-(void)viewWillLayoutSubviews;

//已经布局子视图

-(void)viewDidLayoutSubviews;

//已经展示

-(void)viewDidAppear:(BOOL)animated;

//将要消失

-(void)viewWillDisappear:(BOOL)animated;

//已经消失

-(void)viewDidDisappear:(BOOL)animated;

//内存警告

  • (void)didReceiveMemoryWarning;

//被释放

-(void)dealloc;

从nib文件加载的controller,只要不释放,在每次viewWillAppare时都会调用layoutSubviews方

法,有时甚至会在viewDidAppare后在调用一次layoutSubviews,而重点是从代码加载的则只会在开始调

用一次,之后都不会,所以注意,在layoutSubviews中写相关的布局代码十分危险。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。

image

Android高级架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。

[外链图片转存中…(img-5ZwceLs9-1712790563985)]

Android高级架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值