【问题标题】:- (void)applicationWillResignActive:(UIApplication *)application never gets called- (void)applicationWillResignActive:(UIApplication *)application 永远不会被调用
【发布时间】:2009-12-26 18:40:28
【问题描述】:

我正在尝试处理电话和待机之类的事情。我添加了函数

- (void)applicationWillResignActive:(UIApplication *)application

- (void)applicationDidBecomeActive:(UIApplication *)application

到我的 UIApplicationDelegate。退出待机状态时,总是会调用“applicationDidBecomeActive”。但是问题是“applicationWillResignActive”永远不会被调用。

我想知道是否有人遇到过这个问题以及是否有人找到了原因。

编辑

更多信息,我发现从 applicationDidFinishLaunching 运行的引擎更新循环导致我错过了消息。我打电话

while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, .002, FALSE) == kCFRunLoopRunHandledSource);

捕获所有 iphone 消息,但它似乎没有在变为非活动状态之前捕获 resignActive 消息。

尝试为我的更新循环派生一个线程会导致奇怪的崩溃错误。有人有什么快速修复的建议吗?

【问题讨论】:

  • 根据文档 applicationWillResign active 在弹出覆盖窗口或设备被锁定时被调用。如果你手动锁定 iPhone,你会接到电话吗?

标签: iphone objective-c cocoa-touch


【解决方案1】:

它在 iOS 4.0 中被调用,当 Home 按钮被点击时。

在 iOS 4.0 中点击 Home 按钮时会调用以下委托方法

- (void)applicationWillResignActive:(UIApplication *)application
{
  NSLog(@"Application Did Resign Active");
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
  NSLog(@"Application Did Enter Background");
}

当您双击主页按钮并再次重新启动应用程序时,将调用以下委托方法。

- (void)applicationWillEnterForeground:(UIApplication *)application
{
  NSLog(@"Application Will Enter Foreground");
}



- (void)applicationDidBecomeActive:(UIApplication *)application
{
  NSLog(@"Application Did Become Active");
}

【讨论】:

  • NSLog(@"%s", __PRETTY_FUNCTION__); 添加到每个 appDelegate 方法中,以便更快地打印您当前所在的方法
【解决方案2】:

我不认为

- (void)applicationWillResignActive:(UIApplication *)application

在接到电话时被呼叫。我认为操作系统会等待用户接听或拒绝电话。如果我拒绝了,那么应用程序会说活着并且

- (void)applicationDidBecomeActive:(UIApplication *)application

被调用。如果它被回答,那么你的应用会被告知退出,它会收到

- (void)applicationWillTerminate:(UIApplication *)application

【讨论】:

    【解决方案3】:

    一定要允许

    - (void)applicationDidFinishLaunching:(UIApplication *)application
    

    在运行游戏循环之前返回。一种技术是使用函数

    - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
    

    在应用程序委托上并在延迟说“.01”后运行您的游戏循环在您执行此操作后,消息应该能够正确触发。我相信消息踩踏的原因是因为运行循环卡在 applicationDidFinishLaunching 上并且无法将任何其他 UIApplicationDelegate 消息推送到队列中。

    【讨论】:

      【解决方案4】:
      - (void)applicationWillResignActive:(UIApplication *)application {
      /*
       Sent when the application is about to move from active state to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
       Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
       */
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2013-10-12
        • 2012-03-27
        • 2013-08-29
        • 2013-11-03
        相关资源
        最近更新 更多