我正在构建一个影院列表应用程序,用户可以在该应用程序中向下钻取数据集,最终得到特定电影/影院等的列表。
现在假设用户暂停使用该应用程序7天。重新打开应用程序时,他不应该看到的是7天前的列表。但是如果用户只是将应用程序放在后台几分钟,那么用户应该继续他离开的地方。我想我可以在一定时间后在后台杀死应用程序来解决这个问题。这是代码:
static BOOL goingToQuit = NO;
#define KILL_IN_BACKGROUND_AFTER_SECS 300
- (void)applicationDidEnterBackground:(UIApplication *)application
{
goingToQuit = YES;
UIApplication* app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier __block bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
if(UIBackgroundTaskInvalid != bgTask) {
// Start the long-running task to kill app after some secs and return immediately.
dispatch_after( dispatch_time(DISPATCH_TIME_NOW, KILL_IN_BACKGROUND_AFTER_SECS * 1e09),
dispatch_get_main_queue(), ^{
if(goingToQuit) exit(0);
[app endBackgroundTask: bgTask];
});
}
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// cancel ongoing background suicide.
goingToQuit = NO;
}
我在设备上看到的是:在KILL_IN_BACKGROUND_AFTER_SECS之后,应用程序被杀死了。重新启动设备日志后,显示应用程序获得了新的PID,条目显示重新启动等。但设备未显示default.png启动映像,但显示用户之前所在位置的屏幕截图。
另一方面,如果用户明确地杀死应用程序(双击主页按钮,点击并按住,单击 - 应用程序),然后重新启动它,应用程序将以其default.png启动屏幕启动。这是以编程方式杀死应用程序时所需的行为。
有谁知道如何做到这一点?任何想法都受到高度赞赏。
BTW:作为一种解决方法,我试图在applicationDidEnterBackground期间隐藏主窗口并在applicationWillEnterForeground上再次显示它。然而,当用户在应用程序之间切换时,这对用户来说非常混乱。
答案 0 :(得分:2)
在您的app delegate applicationDidEnterBackground
中,您可以在其余视图前面显示一个视图,操作系统将抓取该视图作为最后一个可见的内容,并且当应用再次激活时将显示该视图(如果是还活着)。
在您的app delegate applicationDidBecomeActive
中,您可以检查数据是否需要更新;如果没有那么简单地关闭视图(动画很好),如果是,那么首先更新(或者只是清除)你的数据,然后关闭视图。
这在应用中相当常见。许多人只是使用default.png启动图像,因为用户习惯于在应用程序正常启动时看到它。