Notas de estudio de iOS (4) -ciclo de vida de la aplicación iOS Ciclo de vida de la aplicación iOS (conmutación frontal y posterior, varios estados de la aplicación) explicación detallada

Ciclo de vida de la aplicación iOS

Estado de la aplicación

Hay 5 estados en la aplicación IOS.

  • No se está ejecutando: el programa no se inicia
  • Inactivo: el estado transitorio que aparece cuando los otros dos estados cambian. ¿El único momento para permanecer en este estado durante mucho tiempo es cuando el usuario bloquea la pantalla? O el sistema solicita al usuario que responda a la ventana de Alerta (como llamadas entrantes, mensajes)
  • Activo: el estado de funcionamiento normal que se muestra en la pantalla , en el que se puede recibir la entrada del usuario y se puede actualizar la pantalla
  • Backgroud: el programa está en segundo plano y puede ejecutar código. El usuario ingresa a este estado poco después de presionar el botón Inicio (primero ingresa al estado Inactivo, luego ingresa al estado de Fondo) y luego ingresa rápidamente al estado Suspendido. Algunos programas pueden permanecer en el estado Backgroud durante mucho tiempo después de una solicitud especial
  • Suspendido: el programa no puede ejecutar código en segundo plano. Los programas ordinarios entrarán en este estado poco después de entrar en el estado de fondo. Cuando se suspende, el programa aún permanece en la memoria. Cuando la memoria del sistema es baja, el sistema borra el programa suspendido para proporcionar más memoria para el programa de primer plano.

Este diagrama es muy importante y cada flecha debe estudiarse cuidadosamente.

Acerca del cambio entre activo e inactivo:

Cuando la aplicación está en primer plano, hay dos estados: activo e inactivo. En la mayoría de los casos, el estado Inactivo es solo un estado de corta duración que aparece cuando se cambian los otros dos estados (no es que el cambio entre dos estados cualquiera entre en Inactivo, como se muestra en la figura). Si abre la aplicación, ingresará Inactivo primero desde No en ejecución y luego ingrese Activo; por ejemplo, cuando se cambian las aplicaciones frontal y posterior, Inactivo aparecerá brevemente entre Activo y Fondo.

Sin embargo, hay otras situaciones. Activo e Inactivo se pueden cambiar cuando se ejecuta en primer plano. Por ejemplo, cuando el sistema muestra Alerta, la aplicación cambiará de Activo a Inactivo hasta que el usuario confirme y luego regrese a Actvie. Si el usuario despliega la página de notificación, Activo también ocurrirá. Cambiar con Inactivo; hay llamadas entrantes pero rechazadas, hacer doble clic en el botón Inicio pero volver a la aplicación original, etc.no ingrese al Fondo, solo cambie entre Activo e Inactivo.

Como se muestra en la figura, puede decir que si desea ingresar a Activo, primero debe ingresar Inactivo.

Función de entrada

int main ( int argc, char * argv []) 
{ 
    @autoreleasepool { 
        return UIApplicationMain (argc, argv, nil, NSStringFromClass ([XYZAppDelegate class ])); 
    } 
}

 

复制代码
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no

// 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类六个方法

注意代码中的官方注释。

  View Code

 

启动程序

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));
}

 

参考文章 

iOS学习笔记(四)——iOS应用程序生命周期

iOS应用程序生命周期(前后台切换,应用的各种状态)详解

iOS应用程序的状态及其切换(生命周期)

转载请注明出处http://www.cnblogs.com/chenyg32/
分类:  iOS
1
0
(请您对文章做出评价)
« 上一篇: 简单的TableView
» 下一篇: iOS ViewController生命周期
posted @  2014-07-28 16:01  Norcy 阅读( 5196) 评论( 0)   编辑  收藏

Supongo que te gusta

Origin blog.csdn.net/qq_27740983/article/details/50844044
Recomendado
Clasificación