博客> App 运行状态
App 运行状态
2019-10-18 20:43 评论:0 阅读:830 nice_future
App运行状态 生命周期

IOS中AppDelegate中的生命周期事件的调用条件: //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电

  • (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"应用程序将要进入非活动状态,即将进入后台"); }

//应用程序已经进入后台运行

  • (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"如果应用程序支持后台运行,则应用程序已经进入后台运行"); }

//应用程序将要进入活动状态执行

  • (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"应用程序将要进入活动状态,即将进入前台运行"); }

//应用程序已经进入活动状态

  • (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"应用程序已进入前台,处于活动状态"); }

//应用程序将要退出,通常用于保存书架喝一些推出前的清理工作,

  • (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"应用程序将要退出,通常用于保存书架喝一些推出前的清理工作"); }

//当设备为应用程序分配了太多的内存,操作系统会终止应用程序的运行,在终止前会执行这个方法 //通常可以在这里进行内存清理工作,防止程序被终止 -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application { NSLog(@"系统内存不足,需要进行清理工作"); }

//当系统时间发生改变时执行 -(void)applicationSignificantTimeChange:(UIApplication *)application { NSLog(@"当系统时间发生改变时执行"); }

//当程序载入后执行 -(void)applicationDidFinishLaunching:(UIApplication *)application { NSLog(@"当程序载入后执行"); }

app 运行状态 typedef NS_ENUM(NSInteger, UIApplicationState) { UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground } NS_ENUM_AVAILABLE_IOS(4_0);

当然,应用不在运行状态,不在考虑之列。只要应用运行起来了,存在以上三种状态。

1.UIApplicationStateActive 这个基本没什么疑问,应用在前台运行时就是这个状态。

2.UIApplicationStateInactive 待激活状。在应用运行状态下,可能引起这种状态的情况有 a.下接状态栏,看通知 b.双击home键,下面弹出任务运行栏 c.锁屏。应该程序也非后台状态。

3.UIApplicationStateBackground 应用在后台状。引起这种状态的情况有: a.按home键 b.启动其它应用,把当前应用挤入后台。

获取app当前信息

NSDictionary *dicInfo = [[NSBundlemainBundle] infoDictionary]; NSLog(@"App Info: %@", [dicInfo debugDescription]);

iOS应用程序的状态及其切换(生命周期) http://www.molotang.com/articles/1254.html 1. 程序的5个状态和对应的AppDelegate的7个方法 至于五个状态,分别是:

  • Not Running, 未运行
  • Inactive, 非活动
  • Active, 活动
  • Background, 后台
  • Suspend, 挂起 对这5种状态,这里先不过多解释,看下图也许就会明白许多。  C831F6B0-5612-40FC-9B7F-A5B2F463017A.png

iOS应用程序状态及互相切换 从这个示意图,我们可以看到哪些状态间是可以互相转化的。而在这些状态互相转化的同时,AppDelegate中对应的生命周期方法会被调用:

    • (BOOL)application:(UIApplication )application willFinishLaunchingWithOptions:(NSDictionary )launchOptions 进程启动但还没完成初始化,这个方法是iOS6之后才有的
    • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 进程启动基本完成
    • (void)applicationWillResignActive:(UIApplication *)application 应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件
    • (void)applicationDidBecomeActive:(UIApplication *)application 应用程序入活动状态,这个刚好跟上面那个方法相反
    • (void)applicationDidEnterBackground:(UIApplication *)application 程序被推送到后台,如果要设置后台继续运行,则在这个函数里面设置即可
    • (void)applicationWillEnterForeground:(UIApplication *)application 程序从后台将要回到前台
    • (void)applicationWillTerminate:(UIApplication *)application 程序将要退出 2. 应用一般启动过程 介绍了iOS应用的基本状态和生命周期方法之后,再简要对应用启动和前台状态做一个整理说明。 对于一般的iOS应用来说,启动之后是进入前台运行的,大概的流程如下图:  18E71C14-FAFD-4D66-BA61-111769A444EB.png

iOS应用启动并进入前台运行 也就是说通常情况下,应用程序启动,图中的三个方法会被依次调用到。 其中前两个方法是我们需要做一些初始化的地方,只在启动时调用,而后面的BecomeActive方法会因程序中断和前后台切换多次调用到。 对于一个简单的应用,初始化主要做的事情就是把View和Controller初始化并结合起来。此外,必要的情况下还要对传入的Options参 数进行解析处理,构建必要的数据结构。而按照官方文档的要求,整个启动过程需要在5秒钟内完成,否则应用进程会因无响应的原因被kill掉。因此,如果有 其它任务需要执行,则应该开启主线程之外的线程来进行,或者是推迟到之后更合适的实际来进行。 应用程序也有启动后直接进入后台运作的,这个可以参看苹果官方文档说明。 3. 前台运行的Active与Inactive 在介绍iOS应用状态5种最基本的状态时,我们发现前台运行有两种状态,分别是Inactive和Active状态。大多数情况 下,Inactive状态只是其它状态之间切换时短暂的停留状态,如前后台应用切换时,Inactive状态会在Active和Background之间 短暂出现。 但也有一些其它情况,Active和Inactive可以在前台运行时互相切换,比如当一个应用安装运行后第一次尝试使用GPS定位,需要获取用户 的允许,给出系统的Alert提示,这时应用会从Active切换到Inactive,直到用户确认后再返回Active。再如,用户在应用运行时从状态 条向下拉出通知页,也会发生Active和Inactive状态的切换。此外,还有来电/拒绝接听,以及App Switcher/回到原应用的操作等,都不进入Backgroud状态,而只在Active与Inactive之间切换。

 AFCF9A70-57DF-4D43-B96E-4F76DE89AFD0.png

Active、Inactive状态和中断响应 4. 其它 除了上面提到的,UIApplicationDelegate也还有很多其它的回调方法。比如隐私数据保护相关的方法,根据一定的数据保护策略,在锁屏和解锁的时候,数据会变得不可用和可用:

    • (void)applicationProtectedDataWillBecomeUnavailable:(UIApplication *)application
    • (void)applicationProtectedDataDidBecomeAvailable:(UIApplication *)application 这是在iOS4开始就支持了的。 在iOS6中,还有了支持应用状态Preserve和Restore的API,使得app可以跨launch保留一些状态信息,这些大多都与UI以及Storyboard相关,细节可参考苹果文档。 此外,在通常的开发过程中,还有几点要注意:
  • 设备锁定时,系统认为当前App进入了Background状态
  • 通常情况下,App在Launch过程完成后是直接进入Active的,WillEnterForeground不会被调用
  • 特殊事件处理的情况下启动,可能不进入前台,此时会调用DidEnterBackground

 C7E390BA-7568-4A91-B04C-DF1490B31267.png

收藏
1
sina weixin mail 回到顶部