按home键后,重新打开软件后2-3秒钟显示上次的页面

一、遇到的问题

1.我遇到的问题是,我的app在后台有大概180秒的执行时间,当我点击home键,程序进入后台,当我再次进入app的时候有2-3秒显示上次点击home键时的页面,然后进入正常状态。
2.在cocoaChina上搜到一个帖子,楼主遇到的问题和我的应该是同一类型,下面是楼主提问的内容:

按home键后手势上划强行关闭程序,重新打开软件后2-3秒钟显示上次的页面
是这样的:我打开我的软件,然后进去随便点到个页面,然后我连按2次Home键,手势上划将软件强行关闭。
然后我重新打开软件,显示的页面竟然是我上次退出时的那个页面,大概过2-3秒钟后,才回到软件的首页面。
这是什么原因造成的?还是要监听强行退出的操作,在里面写相关代码?

原创地址:http://blog.csdn.net/Smiling8866/article/details/51271930

二、引起该问题的原因

该问题的原因就是app状态切换时,系统的snapShot(快照)引起的。系统的快照就是app在进行状态切换时系统记住app发生状态改变记录的一个机制。我们可以通过苹苹果官方文档:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html 中的what to Do When Your App Enters the Background模块中发现这个原因。

内容更详细:http://blog.csdn.net/Smiling8866/article/details/51271930

三、解决方法

那么出现这种问题既然是苹果自身的一个机制所产生的,到底应该如何去解决这种问题呢?以下是解决方案:
1. 当用户点击home键的时候,会执行AppDelegate中的
- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
我们可以在这两个方法中的任意一个方法中为应用创建一个View,然后把这个View添加到系统的window上,让系统去snapShot这个View.此View专门被系统快照,一般可以定义一个和启动页一样的view.
2. 当用户启动App的时候,会触发AppDelegate中的
- (void)applicationDidBecomeActive:(UIApplication *)application
我们可以在这个方法中判断一下上次创建的那个View是否为空,如果不为空,则直接remove掉就可以了。

原创地址:http://blog.csdn.net/Smiling8866/article/details/51271930

四、代码

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"applicationDidEnterBackground");
    _backgroundView = [TVUAnywhereTool createSnapShotView];
    [self.window addSubview:_backgroundView];
}

// TVUAnywhereTool中的类,在此为了方便写到一块儿了
+ (UIView *)createSnapShotView
{
    UIView *myBanner = [[UIView alloc] init];
    myBanner.backgroundColor = [UIColor blackColor];
    myBanner.width = kScreenWidth;
    myBanner.height = kScreenHeight;

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"anywhere_icon.png"]];
    [myBanner addSubview:imageView];
    imageView.center = myBanner.center;
    return myBanner;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"applicationDidBecomeActive");    
    if (_backgroundView != nil) {
        [_backgroundView removeFromSuperview];
        _backgroundView = nil;
    }
}

原创地址:http://blog.csdn.net/Smiling8866/article/details/51271930

你可能感兴趣的:(APP,软件,iOS快照,重新打开软件后2至3,ios显示上次界面)