一、应用程序状态
iOS 应用程序有一下几种状态
Not Running 未运行 应用程序尚未启动
Inactive 未激活状态 程序在前台运行,但未收到任何事件,此时应用程序会停留在未激活状态77
Active 激活 程序在前台运行且收到事件,这是在前台运行的正常模式;
Background 后台 程序在后台运行且拥有执行代码的能力,在未作处理的情况下,app进入后台后会在这个状态停留约5秒,时间到之后app会进入挂起状
态。如果app有内部功能需要,可以调用beginBackgroundTaskWithExpirationHandler 方法去请求后台运行时间和启动
线程来长时间的运行任务。
Suspended 挂起 程序在后台不能执行代码时,便是进入了挂起状态,并且不会发出通知。当程序处于挂起状态是,程序依然停留在内存中,当系统内存
较低时,系统会根据相应的优先级把挂起的程序清理掉并释放相应的内存空间,为前台程序提供更多的内存空间,保证前台程序的正常运
行。
各个程序运行状态时代理的回调:
进程已启动但还没进入状态保存
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
启动基本完成程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
- (void)applicationWillResignActive:(UIApplication *)application
当应用程序入活动状态执行,这个刚好跟上面那个方法相反
- (void)applicationDidBecomeActive:(UIApplication *)application
当程序被推送到后台的时候调用。如果需要设置后台继续运行,在这个函数里面设置即可,如果需长时间后台运行,有相应方法可供调用
- (void)applicationDidEnterBackground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillEnterForeground:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
- (void)applicationWillTerminate:(UIApplication *)application
当程序载入后执行
- (void)applicationDidFinishLaunching:(UIApplication*)application
关于main函数:
main函数是程序启动的入口,在iOS app中,main函数的功能被最小化,它的主要工作都交给了UIKit framework
#import
intmain(intargc,char*argv[])
{
@autoreleasepool{
returnUIApplicationMain(argc, argv,nil,NSStringFromClass([MyAppDelegateclass]));
}
}
UIApplicationMain函数有四个参数,argc 和argv参数包含了系统带过来的启动时间。 第三个参数确定了主要应用程序类的名称,这个参数指定为nil,这样UIKit就会使用默认的程序类UIApplication。第四个参数是程序自定义的代理类名,这个类负责系统和代码之间的交互。它一般在Xcode新建项目时会自动生成。
另外 UIApplicationMain函数加载了程序主界面的文件。虽然这个函数加载了界面文件,但是没有放到应用程序的windows上,你需要在Delegate的 application:willFinishLaunchingWithOptions方法中加载它。
一个应用程序可以有一个主的storyboard文件或者有一个主的nib文件,但不能同时有两个存在。
如果程序在启动时没有自动加载主要的故事版或nib文件,你可以在application:willFinishLaunchingWithOptions方法里准备windows的展示。
前面说到了当来电话时,程序会被终端,这里来说一下,当遇到这些中断时,app该怎么去处理:
1、停止定时器等周期性的任务;
2、停止正在运行的请求,如果是敏感的网络请求,可继续执行;
3、暂停音视频的播放,如视频播放,直播播流,直播推流等;
当程序进入后台后,应进行的操作:
1、保存用户数据或状态信息,将重要数据写入本地磁盘,因为程序进入后台后,在手机内存不够的情况下,可能被杀死释放资源供其他正在运行的进程使用;
2、尽可能的释放内存;
applicationDidEnterBackgound: 方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。如果还需要长时间的运行任务,可以调用 beginBackgroundTaskWithExpirationHandler 方法去请求后台运行时间和启动线程来运行长时间运行的任务。
应用程序在后台时的内存使用
在后台时,每个应用程序都应该释放最大的内存。系统努力的保持更多的应用程序在后台同时 运行。不过当内存不足时,会终止一些挂起的程序来回收内存,那些内存最大的程序首先被终止。
事实上,应用程序应该的对象如果不再使用了,那就应该尽快的去掉强引用,这样编译器可以回收这些内存。如果你想缓存一些对象提升程序的性能,你可以在进入后台时,把这些对象去掉强引用。
下面这样的对象应该尽快的去掉强引用:
图片对象
你可以重新加载的 大的视频或数据文件
任何没用而且可以轻易创建的对象
在后台时,为了减少程序占用的内存,系统会自动在回收一些系统帮助你开辟的内存。比如:
系统回收Core Animation的后备存储。
去掉任何系统引用的缓存图片
去掉系统管理数据缓存强引用
程序终止运行
app如果终止了 ,系统会调用app的代理的方法 applicationWillTerminate: 这样可以让你可以做一些清理工作。你可以保存一些数据或app的状态。这个方法也有5秒钟的限制。超时后方法会返回程序从内存中清除。
注意:用户可以手工关闭应用程序。