如何检测iphone app状态的变化?

时间:2011-02-07 19:20:02

标签: iphone automation background cocoa-design-patterns uiapplicationdelegate

我发布了这个问题(连同答案),以便其他人可以从我已经发展到使用模块自动检测(并响应)iOS应用程序状态更改的简洁技术中受益。 (格式化)博客讨论在My Blog

1 个答案:

答案 0 :(得分:11)

如果您想要解决让代码执行以响应应用状态更改的问题,那么您将找到代码示例,其中您将代码调用添加到应用委托中,因为只要应用程序执行了didFinishLaunchingWithOptions或didBecomeActive就会调用它或WillEnterBackground。

但是,假设您开始处理另一个应用程序,它会重复使用您的大量代码。如果您只是复制一些文件并获得所有功能,而不必担心重新连接应用程序委托方法,那不是很好吗?

总而言之,我们希望插入式模块只需凭借在项目中的优势即可完成工作,无需任何额外的工作或连线。在这一点上,你可能会说“我也想让独角兽和精灵给我带来披萨”。忍受我。

我不确定在阅读文档时我是如何错过这一点的,但是当iOS应用程序改变状态时,不仅仅是知道它的应用程序委托。 NSNotifications也会针对所有主要州的变化发布。这是直接从api参考文本中获取的文本:

在调用[applicationDidBecomeActive]后,应用程序还会发布UIApplicationDidBecomeActiveNotification通知,以便为感兴趣的对象提供响应转换的机会。

同样,有一个UIApplicationDidFinishLaunchingNotification会在应用程序完成启动后立即发布,以及其他用于输入后台或进入前台的通知。

因此,这简化了我们的代码:而不必调用

 [RobustWebService handleAppBecomingActive]

在app delegate的applicationDidBecomeActive实现中,我们只需让RobustWebService响应UIApplicationDidFinishLaunchingNotification。

现在考虑一下,您可能会意识到为了让RWS类处理通知,它必须注册为观察者。那个电话看起来像是

[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil]

那可以在哪里完成?请记住,我们不想触摸应用程序委托,因为这会破坏拥有自包含插入模块的意图。如果只有某种方法让addObserver函数调用自动发生在类中。如果只是......

此时我们不得不退出“Cocoa”并深入研究Objective-C的基础技术。果然,有一个类方法,称为“加载”,如果在类定义中存在,它将在首次加载类时自动调用。让我们在代码中重申一下。如果在任何class.m文件中编写此函数

    + (void) load
    {
                // stuff
    }

当iOS加载类时它将运行。有趣的是,它在你的应用程序的main()例程被调用之前运行,所以你必须非常小心你尝试做什么!此时您的大多数应用程序实际上并未运行,但您可以保证您的类链接的所有框架都将首先加载。诸如NSNotificationCenter之类的框架,因此如果您在class.m中包含此内容

     + (void) load
     {
      [[NSNotificationCenter defaultCenter] addObserver:self
                Selector:@selector(handleAppBecomeActive)
                name:UIApplicationDidFinishLaunchingNotification
                object :nil];
     }

然后当您的应用程序变为活动状态时,您的handleAppBecomeActive方法将被调用,除了在项目中包含class.h和class.m之外,您无需执行任何操作。

如果您在class.m文件中包含此代码

+ (void) load;
{
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(handleAppLaunched)
     name:UIApplicationDidFinishLaunchingNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self         selector:@selector(handleAppResigningActive) name:UIApplicationWillResignActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppBecomingActive) name:UIApplicationDidBecomeActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringForeground) name:UIApplicationWillEnterForegroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppClosing) name:UIApplicationWillTerminateNotification object:nil];
}

您的课程将收到所有应用状态更改的通知,无需其他工作。这太酷了,它仍然让我觉得很刺激。享受!

特里