applicationWillTerminate何时被调用,何时不被调用

Ana*_*and 62 iphone ios4

嗨,我已经阅读了几个关于applicationWillTerminate被调用而没有被调用的问题.

我想总结一下我的理解,因为有几个帖子的说法不同.

  1. 对于IOS(没有多任务处理),在按下主页按钮时始终会调用它.

  2. 适用于IOS 4及以上版本

    一个.按主页按钮时不会调用它(当应用程序移动到后台时)

    湾 从多任务停靠平台关闭应用程序时调用它,如果应用程序在info.plist中有一个突然终止标志禁用,则不会调用它.(我设置"应该应用程序应该死亡事件",甚至在从多任务停靠点关闭应用程序时,终止功能没有被调用)

基于此,我有几个问题

设置应用程序应该获取App Died事件标志是一个好习惯吗?(我设置"应该应用程序应该死亡事件",甚至在从多任务停靠点关闭应用程序时,终止功能没有被调用)

要么

注册"UIApplicationWillTerminateNotification"比info.plist设置更好吗?

基本上我只需要在应用程序终止时做一些工作,而不是在它移动到后台时做.

要么

编辑(1):当应用程序终止时,以下内容被发送到APP.我怎么抓住它?

程序收到信号:"SIGKILL".

编辑(2):

请注意:从多任务底座上卸下时,不会在IOS 4及更高版本中调用它.你可能会认为是.但就我而言,事实并非如此.

我问是否有人知道为什么?还有别的我想念的东西.

另请注意我设置了"应用程序应该获取App Died事件",即使这样也没有被调用.

编辑(3):

以下问题的答案也不起作用. applicationWillTerminate不会被调用

有人像我一样面临类似的问题吗?

Ste*_*ton 49

总之,除非你有UIApplicationExitsOnSuspend你的Info.plist设置为YES,在iOS4的上面还有不能保证applicationWillTerminate:永远不会被调用.

正如文件所说:

对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台.然而,这种方法可以在其中应用程序在背景中(未暂停)运行情况被调用,该系统需要终止它由于某种原因

(强调我的.)

如果您需要在应用程序退出之前执行某些操作,则需要执行此操作applicationDidEnterBackground:.没有办法抓住SIGKILL.


And*_*ger 28

我看到-applicationWillTerminate:通过以下测试被调用.在一个新项目中(我使用了"单一视图应用程序"模板),将以下内容添加到AppDelegate:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"%s", __PRETTY_FUNCTION__);

    __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        for (int i=0; i < 20; i++) {
            NSLog(@"%d", i);
            sleep(1);
        }
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    });
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}
Run Code Online (Sandbox Code Playgroud)

当应用程序进入后台时,此示例将启动后台任务.该任务只是一个20秒的延迟(每秒记录一次),使应用程序在后台运行(注意在后台运行和暂停之间的差异)足够长,以允许它从应用程序切换器中被杀死.

因此,要测试它,运行应用程序,点击主页按钮将应用程序发送到后台,然后在20秒延迟启动之前,从应用程序切换器中删除应用程序.在20年代结束后,-applicationWillTerminate:被称为.您可以在Xcode中观看控制台以验证是否是这种情况.

我在iOS模拟器中为iOS 5.1和6.1(都是iPhone)试过这个,并且在两种情况下都看到了它.我还在运行iOS 6.1.2的iPhone 4S上进行了测试,看到了同样的行为.

  • 如果您在应用程序在前台工作时直接双击主页按钮并向上轻扫并在App Switcher中终止应用程序,则会调用`applicationWillTerminate:`,无论是否有后台任务.但是,如果你只点击一次主页按钮,然后让应用程序首先进入后台,然后双击主页按钮,稍后向上滑动并终止应用程序,只有当后台进程正在进行时才会调用`applicationWillTerminate:` .否则不会被调用. (3认同)