Ciclo de vida do aplicativo iOS
Status do aplicativo
Existem 5 estados no aplicativo IOS.
- Não está funcionando: o programa não foi iniciado
- Inativo: o estado transitório que aparece quando os outros dois estados mudam. A única hora de ficar nesse estado por muito tempo é quando o usuário bloqueia a tela? Ou o sistema solicita que o usuário responda à janela de Alerta (como chamadas recebidas, mensagens)
- Ativo: O estado operacional normal exibido na tela , no qual a entrada do usuário pode ser recebida e a exibição pode ser atualizada
- Backgroud: o programa está em segundo plano e pode executar código. O usuário entra nesse estado logo após pressionar o botão Home (primeiro entra no estado Inativo, depois entra no estado Fundo) e, em seguida, entra rapidamente no estado Suspenso. Alguns programas podem permanecer no estado Backgroud por um longo tempo após solicitação especial
- Suspenso: o programa não pode executar código em segundo plano. Os programas comuns entrarão neste estado logo após entrarem no estado Background. Quando suspenso, o programa ainda permanece na memória. Quando a memória do sistema está baixa, o sistema limpa o programa suspenso para fornecer mais memória para o programa em primeiro plano
Este diagrama é muito importante e cada flecha deve ser estudada cuidadosamente.
Sobre a troca entre Ativo e Inativo:
Quando o aplicativo está em primeiro plano, há dois estados: Ativo e Inativo. Na maioria dos casos, o estado Inativo é apenas um estado transitório que aparece quando os outros dois estados são alternados (não que a alternância entre quaisquer dois estados entrará em Inativo, conforme mostrado na figura). Se você abrir o aplicativo, ele entrará em Inativo de Não Executando primeiro e depois entrará Ativo; Por exemplo, quando os aplicativos frontal e traseiro são alternados, Inativo aparecerá brevemente entre Ativo e Plano de fundo.
Mas há outras situações. Ativo e Inativo podem ser alternados durante a execução em primeiro plano. Por exemplo, quando o sistema exibe Alerta, o aplicativo muda de Ativo para Inativo até que o usuário confirme e, em seguida, volte para Actvie. Se o usuário puxar para baixo a página de notificação, Ativo também ocorrerá. Alternar com Inativo; há chamadas recebidas, mas rejeitadas, clicar duas vezes no botão Início, mas retornar ao aplicativo original, etc. não entra no Plano de Fundo, mas apenas alterna entre Ativo e Inativo.
Conforme mostrado na figura, você pode dizer que se quiser entrar em Ativo, você deve primeiro entrar em Inativo.
Função de entrada
int main ( int argc, char * argv []) { @autoreleasepool { retornar UIApplicationMain (argc, argv, nil, NSStringFromClass ([ classe XYZAppDelegate ])); } }
// Se nil for especificado para principalClassName, o valor para NSPrincipalClass do Info.plist será usado. Se não há // NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init. UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc和argv是为了与C语言保持一致,在这没用到,不详述。
后面两个参数为principalClassName(主要类名)和delegateClassName(委托类名)。
如果principalClassName是nil,那么它的值将从Info.plist中获取,如果Info.plist中没有,则默认为UIApplication。principalClass这个类除了管理整个程序的生命周期之外什么都不做,它只赋值监听事件然后交给delegateClass去做。
而delegateClass将在工程新建时实例化一个对象。
NSStringFromClass([XYZAppDelegate class])
相当于@"XYZAppDelegate"。
AppDelegate类六个方法
注意代码中的官方注释。
启动程序
2014-07-28 15:22:39.883 LifeCycle[3024:a0b] didFinishLaunchingWithOptions
2014-07-28 15:22:39.887 LifeCycle[3024:a0b] DidBecomeActive
按下Home键
2014-07-28 15:22:43.130 LifeCycle[3024:a0b] WillResignActive
2014-07-28 15:22:43.131 LifeCycle[3024:a0b] DidEnterBackground
重新点击程序
2014-07-28 15:22:44.380 LifeCycle[3024:a0b] WillEnterForeground
2014-07-28 15:22:44.380 LifeCycle[3024:a0b] DidBecomeActive
注意:
- 启动程序并没有调用WillEnterForeground这个方法。
- 并不是所有状态切换都有相应的方法来通知,比如从Background到Suspended。所以当你按下Home键的时候,我们只知道调用了WillResignActive和DidEnterBackground方法,但其实应用程序会迅速从Background进入Suspended。
1.application:didFinishLaunchingWithOptions:
程序首次已经完成启动时执行,若直接启动,launchOptions中没有数据;否则,launchOptions将包含对应方式的内容(比如从微信中启动节奏大师--)。
2.applicationWillResignActive(将进入后台)
程序将要失去Active状态时调用,比如按下Home键或有电话信息进来。对应applicationWillEnterForeground(将进入前台),这个方法用来
- 暂停正在执行的任务;
- 禁止计时器;
- 减少OpenGL ES帧率;
- 若为游戏应暂停游戏;
总结为一个字:停!
3.applicationDidEnterBackground(已经进入后台)
程序已经进入后台时调用,对应applicationDidBecomeActive(已经变成前台),这个方法用来
- 释放共享资源;
- 保存用户数据(写到硬盘);
- 作废计时器;
- 保存足够的程序状态以便下次恢复;
总结为4个字:释放、保存!
4.applicationWillEnterForeground(将进入前台)
程序即将进去前台时调用,对应applicationWillResignActive(将进入后台)。这个方法用来撤销applicationWillResignActive中做的改变。
5.applicationDidBecomeActive(已经进入前台)
程序已经变为Active(前台)时调用。对应applicationDidEnterBackground(已经进入后台)。若程序之前在后台,最后在此方法内刷新用户界面。
6.applicationWillTerminate
程序即将退出时调用。记得保存数据,如applicationDidEnterBackground方法一样。
如果你的类是AppDelegate类(声明遵循UIApplicationDelegate协议),那么可以实现上面的6个方法,当App状态改变的时候相应的方法会被调用;如果你的类不是AppDelegate类,那么该类如何知道App的各种状态变化,以及如何使用这些函数呢?答案是使用NotificationCenter来通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:[UIApplication sharedApplication]];
然后实现applicationWillResignActive就行了
- (void)applicationWillResignActive //自定义的函数 { NSLog(@"%@", NSStringFromSelector(_cmd)); }