Iphone 应用程序将在调用和未调用时终止
您好,我已经阅读了一些关于应用程序将终止被呼叫和不被呼叫的问题 我想总结一下我的理解,因为有几篇帖子的表达方式不同Iphone 应用程序将在调用和未调用时终止,iphone,ios4,Iphone,Ios4,您好,我已经阅读了一些关于应用程序将终止被呼叫和不被呼叫的问题 我想总结一下我的理解,因为有几篇帖子的表达方式不同 对于IOS(无多任务处理),当按下home(主页)按钮时,它总是被调用 适用于IOS 4及以上版本 a。当按下home(主页)按钮时(当应用程序移到后台时),它不会被调用 b。从多任务驳接关闭应用程序时会调用它,如果应用程序在info.plist disabled中有突然终止标志,则不会调用它(我设置了“应用程序应获取应用程序死亡事件”,即使从多任务基座关闭应用程序,也没有调用终止
有人面临与我类似的问题吗?简而言之,除非您的Info.plist中的
UIApplicationExitsOnSuspend
设置为YES,否则在iOS4及更高版本中,无法保证应用程序将终止:
将被调用
正如上面所说:
对于支持后台执行的应用程序,此方法是
通常在用户退出应用程序时不调用,因为
在这种情况下,应用程序只需移动到后台。但是,
在应用程序正在运行的情况下,可以调用方法
后台(未挂起),系统需要终止它
出于某种原因
(我的重点。)
如果您需要在应用程序退出之前执行某些操作,则需要在applicationidenterdbackground:
中执行。无法捕获SIGKILL。来源:
我将状态保存代码从applicationWillTerminate复制到ApplicationIdentinterBackground,还添加了一个多任务布尔值,以便我只调用ApplicationIdentinterBackground中的状态保存。因为,多任务设备上有一个实例调用applicationWillTerminate:如果应用程序位于前台,并且您关闭了设备电源。在这种情况下,ApplicationIdentinterBackground和ApplicationTerminate都将被调用
我看到
-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__);
}
-(无效)应用程序标识符背景:(UIApplication*)应用程序
{
NSLog(@“%s”,函数);
__block UIBackgroundTaskIdentifier=[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{
如果(标识符!=UIBackgroundTaskInvalid){
[[UIApplication sharedApplication]endBackgroundTask:标识符];
标识符=UIBackgroundTaskInvalid;
}
}];
dispatch\u async(dispatch\u get\u main\u queue()^{
对于(int i=0;i<20;i++){
NSLog(@“%d”,i);
睡眠(1);
}
如果(标识符!=UIBackgroundTaskInvalid){
[[UIApplication sharedApplication]endBackgroundTask:标识符];
标识符=UIBackgroundTaskInvalid;
}
});
}
-(无效)申请将终止:(UIApplication*)申请
{
NSLog(@“%s”,函数);
}
此示例将在应用程序进入后台时启动后台任务。该任务只是一个20秒的延迟(每秒记录一次),使应用程序在后台运行(注意后台运行和挂起之间的区别)足够长的时间,以允许从应用程序切换器中删除它
因此,要测试它,运行应用程序,点击home按钮将应用程序发送到后台,然后在20秒延迟结束之前,从应用程序切换器中删除应用程序。20秒结束后,-application将终止:
被调用。您可以在Xcode中查看控制台以验证情况是否如此
我在iOS 5.1和6.1(都是iPhone)的iOS模拟器中尝试了这一点,并在这两种情况下都看到了这一点。我还在运行iOS 6.1.2的iPhone 4S上进行了测试,发现了相同的行为。据我所知,有3种情况下,您的应用程序会死机
-[UIApplication applicationWillEnterBackground:
中执行某些操作,在这种情况下,将不会调用-[UIApplication applicationWillTerminate:]
-[UIApplication applicationWillTerminate://code>中执行操作,在这种情况下,我们不知道是否调用了applicationWillEnterBackground:
SIGKILL
)正如我们所知,当
-应用程序将终止时,应用程序只有5秒时间
[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];
print("applicatoinWillTerminate")
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}