Background 后台和挂起应用程序状态之间的混淆

Background 后台和挂起应用程序状态之间的混淆,background,ios5,uiapplication,application-state,Background,Ios5,Uiapplication,Application State,我对这两种状态有点困惑。以下是我的理解 当应用程序处于后台时,如果您有,则应用程序不会运行 在后台“设置为无应用程序内plist文件,然后应用程序继续运行 在后台。在挂起模式下,应用程序将保留在内存中,但不会 执行代码!当应用程序移动到暂停状态时,系统不会通知应用程序 在内存不足的情况下,状态并清除内存中的应用程序,为前台应用程序创建空间 我的理解正确吗?如果是这样的话,为什么当应用程序在后台运行并执行代码时,我不在控制台上打印我的NSLog呢?在我不断从服务器获取数据的地方,我的TCP套接字连

我对这两种状态有点困惑。以下是我的理解

当应用程序处于后台时,如果您有
,则应用程序不会运行
在后台“
设置为无应用程序内plist文件,然后应用程序继续运行 在后台。在挂起模式下,应用程序将保留在内存中,但不会 执行代码!当应用程序移动到暂停状态时,系统不会通知应用程序 在内存不足的情况下,状态并清除内存中的应用程序,为前台应用程序创建空间

我的理解正确吗?如果是这样的话,为什么当应用程序在后台运行并执行代码时,我不在控制台上打印我的NSLog呢?在我不断从服务器获取数据的地方,我的TCP套接字连接到底发生了什么?为什么我们需要挂起状态,因为无论如何,在内存不足的情况下,系统最终会从内存中清除应用程序。应用程序从挂起状态变为活动状态或重新启动之间有什么区别吗?

您应该查看IOS应用程序编程指南中的“应用程序状态和多任务处理”部分。 通过搜索Xcode文档,将短语“应用程序状态和多任务处理”和“点击次数必须”项设置为“匹配搜索项”,可以发现这一点。另一个有用的搜索短语:“后台执行”

简单的回答是,应用程序可以无限期地在后台“执行”,原因有限:

在iOS中,仅允许特定应用类型在后台运行:

  • 在后台向用户播放音频内容的应用程序, 例如音乐播放器应用程序
  • 让用户随时了解自己的应用程序 位置,如导航应用程序
  • 支持互联网语音协议(VoIP)的应用程序
  • 需要下载和处理新内容的报摊应用程序
  • 从外部附件接收定期更新的应用程序
除了这些特定的操作之外,应用程序还可以要求在很短的时间内继续执行,文档将在“在后台执行有限长的任务”一节中介绍这一点。短时间后,要么你的应用程序告诉系统它已经完成(然后被挂起),要么它被强制终止。详情请参阅文件

该文档的另一个有用部分是“管理应用程序状态更改”一节,其中包含了漂亮的状态图。这一部分讲的是进入背景,回到前景。它应该能回答你的问题,即从新鲜状态开始与从暂停状态开始之间的区别。简短(不完全正确)的答案是,如果你从暂停状态开始,在进入背景或(重新)进入前景时没有采取任何特殊行动,那么你只是或多或少地从原来的位置继续。另外,从挂起状态开始更快。阅读文档,因为它说它比我的解释要好得多。

appstate

未运行:您的应用程序在启动前处于此状态

活动:启动应用程序后,接收事件

不活动:当你的应用程序正在运行,但有什么事情中断了它,比如电话,它会变为不活动。Inactive表示应用程序仍在前台运行,但未接收事件

背景:在此状态下,您的应用程序不再位于前台,但仍能运行代码


挂起:当您的应用程序无法再运行代码时,将进入此状态。

背景:

  • 执行代码-在应用程序处于后台状态时执行代码
  • 应用程序必须先进入后台状态,然后才能进入挂起状态
  • 假设你在Facebook上上传了一段视频,按下POST按钮后立即切换到另一个应用程序。虽然您已切换到另一个应用程序,但不终止该应用程序,但可以将该应用程序配置为执行后台进程以完成上载
  • 处于后台的应用程序不一定意味着它已暂停,但处于暂停状态的应用程序处于后台
  • 应用程序可以请求在后台模式下额外停留一段时间(例如,为了在后台播放音频或完成网络请求);之后,它要么进入暂停状态,要么被系统强制终止
暂停:

  • 不执行代码-应用程序处于挂起状态时不执行代码
  • 处于挂起状态的应用程序也处于后台状态
  • 系统将应用程序移动到此状态,而不提前通知您
  • 处于挂起状态的应用程序仍在内存中。
关于此主题的一些其他信息:

  • UIApplication通过AppDelegate中的方法通知应用程序状态转换。
    大多数状态转换都伴随着这些方法。
    这些方法是UIApplicationLegate协议的一部分。
    它们为您提供了对状态变化作出响应的机会。

    例如,下面的方法告诉代理应用程序即将终止的时间
    -仅当应用程序在终止前处于后台时才会调用;没有暂停

    func应用程序将终止(application:UIApplication){…}

  • 除了Charlie Price 2013年的回答外,iOS现在还允许以下背景:

    • 表示有新内容可供下载的远程通知。当收到远程通知时,系统会在后台启动或恢复应用程序,并为其提供少量时间下载新内容
    • 核心蓝牙可在后台与蓝牙附件通信
  • UIApplication.shared.backgroundTimeRemaining告诉您