MENU

iOS 开发 - 应用生命周期

March 20, 2016 • Read: 788 • Codes

移动设备上应用的生命周期和传统的桌面应用有很大的不同,iOS也是如此。「得益于」iOS的墓碑机制,在一般情况下,用户同时只能使用一个应用(Foreground App),而其他应用则面临着各种各样的状态。

应用状态

iOS应用可能存在以下几种状态:

  • Not Running
  • Foreground

Foreground 状态又分为Inactive 和 Active两个子状态,在应用进入Foreground状态,且应用界面没有被加载完成并显示前,为Inactive 状态,此状态下同样不响应用户事件。

  • Background
  • Suspended

系统通过 AppDelegate 通知应用其当前的状态。而当应用状态发生变更时,系统就会调用 AppDelegate 中的相应方法,而我们则可以在这些方法里完成对应用的初始化、数据保存等事情。

应用从Not Running变更为Foreground

比如用户打开应用、或应用通过其他方式被打开,就会从Not Running 状态变更为Foreground的Inactive状态。在这个过程中,系统会先调用:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);

然后调用:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);

willFinishLaunchingWithOptions:是iOS6新增的方法,所以在iOS6及之后,建议在willFinishLaunchingWithOptions:中执行一些应用级初始化任务。在此方法被调用前,系统就已经初始化好了UIWindow及其RootViewController(如果可以被初始化)。

didFinishLaunchingWithOptions: 里可以放一些状态恢复的代码。

接下来,应用从Inactive状态变更为Active状态后,系统会调用:

- (void)applicationDidBecomeActive:(UIApplication *)application;
应用从Active状态变更为Inactive状态

比如应用在使用的时候,有电话呼入,切换到多任务视图,或用户退出应用,在其状态转变为Background之前,应用就会从Active状态变更为Inactive状态。

在变更前,系统会调用如下方法:

- (void)applicationWillResignActive:(UIApplication *)application;

我们可以在这里暂停正在进行的任务,或暂停绘图、暂停游戏等。

应用变更为Background状态

如上,在应用从Active状态变更为Inactive状态后,如果应用支持Background,应用就会进入Background状态,然后会调用:

- (void)applicationDidEnterBackground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);

我们可以在这里保存数据什么的,默认情况下应在5秒内完成。否则会被中断执行。如果需要,可以使用UIApplication的方法:

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^ __nullable)(void))handler  NS_AVAILABLE_IOS(4_0) NS_REQUIRES_SUPER;
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(nullable NSString *)taskName expirationHandler:(void(^ __nullable)(void))handler NS_AVAILABLE_IOS(7_0) NS_REQUIRES_SUPER;

延长至约10分钟。

执行完这些任务后,应用随时可能会进入Suspended状态。

进入Background的应用重新回到Foreground时,会首先调用:

- (void)applicationWillEnterForeground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);

然后进入Inactive状态,进而进入Active状态然后调用applicationDidBecomeActive:方法。

如果应用从Inactive状态完全退出运行,并释放内存,如用户在使用应用后切换到多任务视图,然后结束运行,系统会调用:

- (void)applicationWillTerminate:(UIApplication *)application;

而如果是从挂起的状态被结束运行(如用户使用其他应用导致系统内存不足),是不会调用包括 applicationWillTerminate: 等方法的。

Tags: iOS, iOS开发
Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment