iOS从程序的点击到程序死亡(App的一生)

项目中出现了一个消息角标设置的bug,涉及到UIApplication对象的处理。在此记录下加深对UIApplication的理解。windows

1、UIApplication的基础认识浏览器

UIApplication是应用级别的一个单例。咱们一个应用启动到内存释放始终且只对应一个UIApplication对象,此对象控制着应用级别的交互,如打开其它应用等。此外其代理提供给咱们应用启动、退出到后台、从新进入、退出等操做。app

一、UIApplication对象属性函数

windows        添加的windowoop

keyWindow     程序的主window,程序在每一个时刻只能有一个主window。好比每一个警告框就是一个window可是在每个时刻只能有一个主window。当警告框显示的时候警告框就是主window。同理键盘事件也是同样。动画

networkActivityIndicatorVisible  联网可见性url

statusBarStyle   状态栏样式.net

statusBarHidden  状态栏的显示代理

statusBarOrientation  状态栏方向对象

statusBarOrientationAnimationDuration  当改变状态栏的时候动画的改变时间

statusBarFrame  状态栏的frame(没有隐藏的时候)

applicationIconBadgeNumber  程序图案icon图上的角标

applicationSupportsShakeToEdit  摇一摇

applicationState  App此时的状态(正在前台运行或进入后台挂起)

backgroundTimeRemaining  进入后台后能够执行的时间(当程序进入后台后,能够运行代码的时间是有限的,若是延长了执行时间此属性会返回总共剩余时间)

- (BOOL)openURL:(NSURL*)url  可经过此方法打开其它程序(吊起电话或者打开浏览器等)

二、UIApplicationDetegate--程序代理

当App被打开、处于前台运行状态、被事件打断运行、home键进入后台、从新进入前台运行、内存警告、退出等咱们都能经过UIApplicationDetegate的代理事件拿到相关接口。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

app启动完成的时候,执行此通知,在此咱们初始化界面什么的。也就是平时咱们写的。
    return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {

当App不活跃的时候,暂时挂起的状态好比接入电话等。注意当home键返回桌面,程序进入后台的时候并不会触发此通知
}
- (void)applicationDidEnterBackground:(UIApplication *)application {

当咱们点击home键返回桌面程序进入后天的时候触发此通知。此时iOS系统容许程序能够有5s钟的时间运行代码。固然能够向系统申请更长的运行时间可是程序在后台不能存活过10分钟,10分钟事后会系统会强制挂起程序。若是内存吃紧的话,会释放此App所占用的内存给其余程序使用。
}
- (void)applicationWillEnterForeground:(UIApplication *)application {

从后台到前台的一个过渡时间段
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    程序变为活跃状态,注意的是程序启动或者当程序在后台内存尚未被系统回收处于挂起状态(内存被回收后点击App会从新启动,没有被回收点击App直接回到按home键时的界面)都会走此方法。
}
- (void)applicationWillTerminate:(UIApplication *)application {
    程序退出时执行的方法。好比双击home键后将程序上划退出。
}

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{

发生内存警告时触发的方法
}

// 当应用程序启动完毕的时候就会调用(系统自动调用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"didFinishLaunchingWithOptions");
    return YES;
}

2、程序的建立和退出

每一个项目中都有一个main函数,它是咱们App和系统的接口,建立运行App:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

UIApplicationMain建立了UIApplicationnil(nil--系统默认传入一个UIApplication)和UIApplicationDelegate(NSStringFromClass([AppDelegate class])。此外其还帮咱们开启了一个runloop,就是循环-死循环。runloop中不断的监听各类的系统事件,好比home键有没有按下、有没有接入电话等等。当监听到后会触发对应的代理方法如home键按下后让程序进入后台并触发AppDelegate中的系统进入后台的方法,执行咱们的代码。

相关文章
相关标签/搜索