225 votes

applicationWillEnterForeground vs applicationDidBecomeActive, applicationWillResignActive vs applicationDidEnterBackground

Qui est le délégué à mettre en œuvre lorsqu'une application est de se réveiller d'être en arrière-plan et que vous le voulez afin de la préparer à être actif?

applicationWillEnterForeground vs applicationDidBecomeActive -- Quelle est la différence?

Qui est le délégué à mettre en œuvre lorsqu'une application est d'aller dormir et que vous voulez de préparation pour le nettoyage et enregistrer les données?

applicationWillResignActive vs applicationDidEnterBackground -- Quelle est la différence?

Aussi, j'ai remarqué que applicationWillResignActive qui est appelé lorsque l'arrivée d'un SMS ou un appel arrive, mais l'utilisateur choisit de cliquer sur Ok pour continuer. Je ne veux pas que mon application pour prendre toute action dans ces cas. J'ai juste envie de continuer à courir sans intermédiaire de nettoyage, car l'utilisateur n'a pas de quitter l'application. Donc, je pense qu'il est plus logique de faire des travaux de nettoyage juste en applicationDidEnterBackground.

Je vous remercie de votre entrée sur les meilleures pratiques à suivre sur le choix des délégués à mettre en œuvre pour se réveiller et d'aller dormir, ainsi qu'à considérer les événements comme étant interrompu par SMS/appels.

Merci

467voto

Dano Points 2674

Au réveil c'est à dire la relance d'une application (que ce soit par le biais de tremplin, au changement d'application ou URL) applicationWillEnterForeground: est appelé. Il n'est exécuté qu'une seule fois lorsque l'application est prête pour une utilisation après la mise en arrière-plan, tandis que l' applicationDidBecomeActive: peut être appelé plusieurs fois après le lancement. Cela rend applicationWillEnterForeground: idéal pour l'installation qui doit se produire une seule fois après relance.

applicationWillEnterForeground: s'appelle:

  • lorsque l'application est relancée
  • avant d' applicationDidBecomeActive:

applicationDidBecomeActive: s'appelle:

  • lorsque l'application est lancé pour la première fois après l' application:didFinishLaunchingWithOptions:
  • après l' applicationWillEnterForeground: si il n'y a pas d'URL à manipuler.
  • après l' application:handleOpenURL: est appelé.
  • après l' applicationWillResignActive: si l'utilisateur ignore interruption, comme un appel téléphonique ou SMS.

applicationWillResignActive: s'appelle:

  • quand il y a une interruption, comme un appel téléphonique.
    • si l'utilisateur prend l'appel applicationDidEnterBackground: est appelé.
    • si l'utilisateur ignore appel applicationDidBecomeActive: est appelé.
  • lorsque le bouton est pressé ou que l'utilisateur change l'apps.
  • docs disent que vous devriez
    • pause des tâches en cours
    • désactiver les minuteries
    • mettre en pause un jeu
    • réduire OpenGL taux de trame

applicationDidEnterBackground: s'appelle:

  • après l' applicationWillResignActive:
  • docs disent que vous devriez:
    • communiqué de ressources partagées
    • enregistrer les données de l'utilisateur
    • invalider les minuteries
    • enregistrer l'état d'application de sorte que vous pouvez les restaurer si l'application est terminée.
    • désactiver les mises à jour de l'INTERFACE utilisateur
  • vous avez 5 secondes pour faire ce que vous nécessaire, et le retour de la méthode
    • si vous n'avez pas de retour au sein de ~5 secondes, l'application est terminée.
    • vous pouvez demander plus de temps avec beginBackgroundTaskWithExpirationHandler:

La documentation officielle.

28voto

tomjpsun Points 136

Ce Document Apple est utile à vos questions. Pour rapide concept, vous pouvez voir Figure 3-1 dans ce document. Vous pouvez aussi lire le commentaire dans le code généré par le XCode Assistant. Répertoriés comme suit:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    /*
     Sent when the application is about to move from active to inactive state. 
     This can occur for certain types of temporary interruptions (such as an 
     incoming phone call or SMS message) or when the user quits the application 
     and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down 
     OpenGL ES frame rates. Games should use this method to pause the game.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the inactive state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

Dans le code ci-dessus, seule la demande de lancement ne vous en ont de la chance de dire OUI ou NON, les autres ne sont que des notifications. En d'autres termes, vous n'avez aucun moyen de forcer les utilisateurs à la négligence de l'appel entrant ou SMS par le code de l'exemple ci-dessus. Ne sais pas si il y a une autre solution de contournement.

13voto

Rahmi Aksu Points 1

J'étais encore un peu confus avec Dano réponse donc j'ai fait un petit test pour obtenir le flux d'événements dans certains scénarios pour ma référence, mais il pourrait être utile à vous aussi. C'est pour les applications qui N'utilisent PAS d' UIApplicationExitsOnSuspend de leur info.plist. Elle a été réalisée sur un simulateur iOS 8 + confirmé avec iOS 7 de l'appareil. S'il vous plaît excusez Xamarin de l'événement gestionnaire de noms. Ils sont très similaires.

  • Initial et de tous les lancements à partir d'un état non exécuté:

FinishedLaunching

OnActivated

  • Interruption (appel téléphonique, du haut de glissoire-bas, de bas en slide-up):
  • Bouton accueil, appuyez deux fois sur inscription inactive apps, puis réactiver notre application:

OnResignActivation


OnActivated

  • Bouton accueil, appuyez deux fois sur inscription inactive applications, la sélection d'une autre application, puis la relance de notre application:
  • La maison de bouton unique, appuyez sur, puis relancer:
  • De verrouillage (bouton on/off), puis déverrouiller:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • Bouton accueil, appuyez deux fois sur, et mettre fin à notre application: (après relance est premier cas)

OnResignActivation

DidEnterBackground

DidEnterBackground (iOS 7 uniquement?)

Oui, DidEnterBackground est appelé deux fois sur iOS7 appareil. Les deux fois UIApplication de l'état de l'arrière-plan. Toutefois, iOS 8 simulateur ne fonctionne pas. Ce besoin de tests sur iOS 8 appareil. Je vais mettre à jour ma réponse quand je reçois ma main sur elle, ou quelqu'un d'autre pouvait confirmer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X