一、iOSApp五种状态
- 5种状态
- Not running
- App还没有启动或者已经被系统终止
- Inactive
- App正在前台运行,但此时还不能接收事件
- 这是一个短暂的过渡状态,会很快进入Active或Background状态
- Active
- App正在前台运行,能接收事件
- Background
- App处于后台,但还能执行代码;通常只能保持5秒
- 可以通过beginBackgroundTaskWithExpirationHandler申请延长后台时间,延长时间不超过600秒
- Suspended
- App处于后台,依然在内存中但不能执行代码
- 当系统内存低是可能会被逐出内存
- Not running
- App在5种状态间的转换流程图
- App生命周期有关的几个时间规则
二、Launch Options Keys
- 无论App在前台启动还是后台启动,能参与控制启动的两个点分别是appdelegate的两个回调;在这两回调中要确认App因何启动,还要准备app在启动过程中需要的数据和展示的UI
- application:willFinishLaunchingWithOptions:
- application:didFinishLaunchingWithOptions:
- 此方法返回后UIKit才会将window显示在屏幕上
- launchOptions记录了app启动原因以及相应的参数信息
- nil:直接点icon启动
- UIApplicationLaunchOptionsURLKey:App因openUrl启动
- UIApplicationLaunchOptionsSourceApplicationKey:App因openUrl启动,启动App的bundle id
- UIApplicationLaunchOptionsRemoteNotificationKey
- App响应远程推送消息在前台启动
- App响应静默推送消息在后台启动
- UIApplicationLaunchOptionsLocalNotificationKey:App响应本地推送前台启动
- UIApplicationLaunchOptionsLocationKey:APP因为一个位置相关的事件而启动
- 地理围栏越界App在后台启动
- UIApplicationLaunchOptionsBluetoothCentralsKey:蓝牙在后台启动App来初始化中心设备
- UIApplicationLaunchOptionsBluetoothPeripheralsKey:蓝牙在后台启动App来初始化周边设备
- UIApplicationLaunchOptionsShortcutItemKey:3D Touch启动App
- 其他启动Key
- UIApplicationLaunchOptionsUserActivityDictionaryKey
- UIApplicationLaunchOptionsUserActivityTypeKey
- UIApplicationLaunchOptionsCloudKitShareMetadataKey
- 前台启动App
- 状态:not running –> inactvie –> active
- 系统创建一个新的进程已经主线程 –> 主线程上调用main函数 –> UIApplicationMain
- application:willFinishLaunchingWithOptions:
- application:didFinishLaunchingWithOptions:
- 展示UI
- 后台启动App
- 状态:后台启动进入background –> 处理事件 –> Suspended
- 系统创建一个新的进程已经主线程 –> 主线程上调用main函数 –> UIApplicationMain
- application:willFinishLaunchingWithOptions:
- application:didFinishLaunchingWithOptions:
- 不展示UI
- 后台事件类型
- 系统接收到silent push
- 系统启动 app 执行 background fetch 任务
- background transfer 相关的事件,如任务完成、失败或需要鉴权等
- newsstand apps、location apps、audio apps以及bluetooth apps收到相应的事件
- App能在后台启动的前提是用户没有在任务中心强制将app kill掉(iOS8 下的location apps除外)??待验证
- 判断前台启动还是后台启动:application:[will | did]FinishLaunchingWithOptions
- UIApplicationStateInactive:前台启动
- UIApplicationStateBackground:后台启动
openURL打开App
- 前台启动App
- application:[will | did]FinishLaunchingWithOptions两个函数中判断能否处理该url
- 两个函数都返回YES,进入application:openURL:sourceApplication:annotation:
- 后台启动App
- Background –> Active
临时中断
- 电话、打开通知中心、打开控制中心
- App依然在前台运行,但其状态转换为inactive,不能接收touch events,可以继续接收notifactions以及其他events
- 调用applicationWillResignActive:回调
- 忽略临时中断操作
- 调用applicationDidBecomeActive:回调