进入一个iOS程序时,先看main.m里面的UIApplicationMain,若主类名为nil,则默认为UIApplication(这个类除了管理整个程序的生命周期之外什么都不做,它只赋值监听事件然后交给delegateClass去做。),delegateClassName即委托类名(在工程新建时实例化一个对象)一般实例化为AppDelegate。
这时候,进入AppDelegate类里面,该类遵循UIApplicationDelegate协议,可以实现下面6种方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//1.启动程序,若直接启动,launchOptions中是没有数据的
//这是一个程序开始的根本,它决定了程序从哪里开始首次进入哪一个页面。
//配置一个APP在整个生命过程中需要的参数或者功能的时候可以在这个方法进行配置,比如:数据统计、推送、分享、网络监测等。
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
//2.将进入后台,比如按下Home键或有电话信息打进来,此时暂停正在执行的任务
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
//3.已进入后台,按下Home键之后,释放共享资源;保存用户数据到硬盘
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
//4.将进入前台,如重新点击程序 (撤销方法2中的改变)
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
//5.重新点击程序,若之前在后台,则此时刷新用户界面
}
- (void)applicationWillTerminate:(UIApplication *)application {
//6.程序终止,程序即将退出,在这里保存数据(同3)
}
APP声明周期中并不是所有状态切换都有响应方法来通知,如从后台Background到挂起Suspended。所以当按下Home键的时候,我们只知道调用了WillResignActive和DidEnterBackground方法,但其实应用程序会迅速从Background进入Suspended。
以上是在AppDelegate类监听APP各种状态。如果是在其他类里想要监听APP运行状态,应该使用通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(terminateAPP) name:UIApplicationWillTerminateNotification object:nil];
//当本类监听到程序即将退出时,就会调用terminateAPP方法
-(void)terminateAPP{
NSLog(@"%@",NSStringFromSelector(_cmd));
}
在最后用完通知后也要将观察者移除:
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}