当前位置: 首页 > 科技观察

说说App应用的生命周期

时间:2023-03-19 17:10:10 科技观察

对于iOS应用来说,关键是要知道你的应用是运行在前台还是后台。由于系统资源在iOS设备上更为有限,因此应用程序在后台的行为必须与在前台的行为不同。操作系统还会限制您的应用程序在后台运行,以延长电池寿命并改善前台应用程序的用户体验。当应用程序在前台和后台之间切换时,操作系统会通知您的应用程序。您可以通过这些通知修改应用程序的行为。当您的应用程序在前台处于活动状态时,系统会将触摸事件发送给它进行处理。UIKit基础结构完成了将事件传递给自定义对象的大部分工作。您需要做的就是覆盖相应对象上的方法来处理这些事件。对于控件,UIKit将通过处理您的触摸事件或其他一些有趣的事情发生时调用您的自定义代码,例如当文本字段中的值更改时。1:ThestatusoftheapplicationisNotrunning:程序没有启动。Inactive未激活:程序在前台运行,但没有收到任何事件。程序通常停留在这种状态而不进行事件处理。主动激活:程序在前台运行,已经接收到事件。这也是前台的常态。后台:程序在后台,可以执行代码。大部分程序在进入该状态后会在该状态停留一段时间。时间到后,会进入暂停状态(Suspended)。有些程序在特殊请求后可以长时间处于Backgroud状态。Suspended:程序不能在后台执行代码。系统会自动将程序置于此状态,恕不另行通知。挂起时,程序仍然停留在内存中。当系统内存不足时,系统会清除挂起的程序,为前台程序提供更多的内存。2:agent在各个程序运行时的回调①告诉agent进程启动但不进入状态save1-(BOOL)application:(UIApplication*)applicationwillFinishLaunchingWithOptions:(NSDictionary*)launchOptions2{3NSLog(@"①告诉agent进程Started但还没有进入状态save");4returnYES;5}②告诉agent启动基本完成,程序准备运行1-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions2{3self.window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];45NSLog(@"②告诉agent启动基本完成,程序可以运行了");67//应用程序启动后自定义覆盖点。89self.window.backgroundColor=[UIColorwhiteColor];10[self.windowmakeKeyAndVisible];11returnYES;12}③当应用即将进入inactive状态时,在此期间,应用不接收消息或事件,例如IncomingCall1-(void)applicationWillResignActive:(UIApplication*)application2{3//当应用程序即将从活动状态变为非活动状态时发送。对于某些类型的临时中断(例如传入电话或SMS消息)或当用户退出应用程序并开始转换到后台状态时。4//使用此方法暂停正在进行的任务、禁用计时器并降低OpenGLES帧速率。游戏应该使用该方法暂停游戏。5NSLog(@"③当应用程序即将进入非活动状态时,在此期间,应用程序不会收到消息或事件,例如来电");6}④当应用程序进入活动状态,执行1-(void)applicationDidBecomeActive:(UIApplication*)application2{3//重新启动在应用程序处于非活动状态时暂停(或尚未启动)的任何任务。如果应用程序之前在后台,可选择刷新用户界面。4NSLog(@"④当应用程序进入激活状态执行时");5}⑤程序被推送到后台时调用所以要设置后台继续运行,只需要在这个函数中设置1-(void)applicationDidEnterBackground:(UIApplication*)application2{3//使用这个方法释放共享资源,保存用户数据,使定时器失效,存够应用程序状态信息,用于将您的应用程序恢复到当前状态,以防它稍后被终止。4//如果您的应用程序支持后台执行,则在用户退出时调用此方法而不是applicationWillTerminate:。5NSLog(@"⑤程序推送到后台时调用");67[applicationbeginBackgroundTaskWithExpirationHandler:^{89NSLog(@"beginBackgroundTaskWithExpirationHandler");1011}];12}⑥程序即将从后台返回前台时调用1-(void)applicationWillEnterForeground:(UIApplication*)application2{3//作为从后台到非活动状态转换的一部分被调用;这里可以撤销很多进入后台时所做的修改。4NSLog(@"⑥当程序即将从后台回到前台时Callwhen");5}⑦程序即将退出时调用,通常用于保存数据和退出前清理这个需要设置UIApplicationExitsOnSuspend的键值1-(void)applicationWillTerminate:(UIApplication*)application2{3//当应用程序即将终止时调用。如果合适,保存数据。另见applicationDidEnterBackground:.4NSLog(@"⑦当程序即将退出时会被调用");5}⑧程序加载时执行1-(void)applicationDidFinishLaunching:(UIApplication*)application2{3NSLog(@"⑧程序加载时执行");4}程序启动When:2014-07-0115:55:14.706LifeCycle[5845:60b]①告诉agent启动进程但是还没有进入状态save2014-07-0115:55:14.708LifeCycle[5845:60b]②告诉agent开始基本完成程序,准备开始运行2014-07-0115:55:14.709LifeCycle[5845:60b]④应用程序进入时active状态,按Home键返回主界面:2014-07-0115:56:11.756LifeCycle[5845:60b]③当应用程序即将进入inactive状态时,执行2014-07-0115:56:11.814LifeCycle[5845:60b]⑤当应用被推送到后台时,再次调用打开应用:2014-07-0115:57:19.200LifeCycle[5845:60b]⑥调用2014-07-0115:57:19.201LifeCycle[5845:60b]当程序即将从后台返回前台时进入前台4:加载应用程序并进入后台5:根据警告响应中断当出现这样的中断时,我们需要在-(void)applicationWillResignActive:(UIApplication*)application方法中进行如下操作动作:①停止定时器和其他周期性任务②停止任何正在运行的请求③暂停视频播放④如果是游戏就暂停⑤降低OpenGLES的帧率⑥暂停任何分发队列和不重要的操作队列(你可以继续处理网络requestsorothertime-sensitivebackgroundtasks)当应用回到活动状态时,我们需要在-(void)applicationDidBecomeActive:(UIApplication*)application方法中重启上面的任务但是游戏会回到暂停状态,不能自动启动。6:进入后台运行当应用程序进入后台时,我们应该做什么?保存用户数据或状态信息,所有未写入磁盘的文件或信息,***在进入后台时写入磁盘,因为程序可能在后台被杀死。释放尽可能多的内存。-(void)applicationDidEnterBackground:(UIApplication*)application方法有大约5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,您的程序将被终止并从内存中清除。如果还需要长时间运行任务,可以在这个方法中调用1[applicationbeginBackgroundTaskWithExpirationHandler:^{23NSLog(@"beginBackgroundTaskWithExpirationHandler");45}];应用程序在后台时的内存使用情况:请求后台运行时并启动线程以运行长时间运行的任务。在后台时,每个应用程序都应该释放最多的内存。系统会努力让更多的应用程序同时在后台运行。但是,当内存不足时,会终止一些挂起的程序来回收内存,那些内存满的程序会先终止。事实上,如果应用程序应该使用的对象不再被使用,强引用应该尽快被移除,以便编译器回收内存。如果要缓存一些对象以提高程序性能,可以在进入后台时去掉对这些对象的强引用。对于以下对象,应尽快删除强引用:①图像对象②可以重新加载的大型视频或数据文件③任何无用但可以轻松创建的对象当对象在后台时,为了减少程序占用的内存,系统会自动回收一些系统帮你开辟的内存。例如:①系统回收CoreAnimation的后备存储。②删除系统引用的任何缓存图像③删除系统管理数据缓存强引用7:返回前台运行在暂停状态的应用程序在返回到前台或后台执行状态时必须准备好处理任何排队的通知。暂停的应用程序不执行任何代码,因此无法处理方向更改、时间更改、偏好更改以及影响应用程序外观或状态的许多其他通知。为了确保这些更改不会丢失,系统会排队一些相关的通知,并在应用程序再次开始执行代码(无论是在前台还是后台)时立即将它们传递给应用程序。为了防止您的应用在恢复时不堪重负并收到通知,系统会汇总事件并提供一个通知(每个相关类型),以反映自您的应用暂停以来的净变化。8:程序终止只要程序满足以下条件之一,只要进入后台或挂起就会终止:①iOS4.0之前的系统②本app是基于iOS4.0之前的系统开发的。③设备不支持多任务④在Info.plist文件中,程序包含UIApplicationExitsOnSuspend键。如果应用程序终止,系统将调用应用程序的代理方法-(void)applicationWillTerminate:(UIApplication*)application,它允许您进行一些清理。您可以保存一些数据或应用程序的状态。此方法也有5秒的限制。超时后,该方法返回到程序并从内存中清除。注意:用户可以手动关闭应用程序。9:MainRunLoopMainRunLoop负责处理与用户相关的事件。UIApplication对象在程序启动时启动主运行循环,它处理事件并更新视图的界面。从MainRunLoop可以看出它运行在程序的主线程上。这确保了接收用户相关操作的事件被顺序处理。用户操作设备,相关操作事件由系统产生,通过UIKit指定端口分发。事件在内部排队,并逐一分发到主运行循环中进行处理。UIApplication对象是第一个接收事件的对象,它决定了事件的处理方式。触摸事件分发给主窗口,窗口再分发给相应的触发触摸事件的View。其他事件通过其他通道分发给其他对象变量进行处理。大多数事件都可以在您的应用程序中调度,类似于触摸事件、远程控制事件(无线耳机等)由应用程序的响应程序对象处理。Responder对象在你的app中无处不在,例如:UIApplication对象、view对象、viewcontroller对象都是respnder对象。大多数事件的目标指定resopnder对象,但事件也可以传递给其他对象。例如,如果视图对象不处理事件,则可以将其传递给父视图或视图控制器。------------------------------------本文根据官方文档整理,基本翻译取决于谷歌。点击查看英文原版