`

ios 4 新特性 多任务

 
阅读更多

一:了解multitasking

        background apps(可以在后台运行的任务):

             1:play audio 

             2:get location

             3:voip stream

             4:request time to finish

             5: create notifications

 

二:多任务生命周期

 

1:程序加载成功

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

 

2:程序将要失去活跃状态

- (void)applicationWillResignActive:(UIApplication *)application

 

3:程序已经进入后台运行

- (void)applicationDidEnterBackground:(UIApplication *)application

 

4:程序将要进入前台运行

- (void)applicationWillEnterForeground:(UIApplication *)application

 

5:程序进入活跃状态

- (void)applicationDidBecomeActive:(UIApplication *)application

 

6:程序退出

- (void)applicationWillTerminate:(UIApplication *)application

 

 

从启动到转入后台,从后台转入前台,退出,生命周期函数调用顺序

1->5->2->3->4->5->6

 

 

三:转入后台后请求一段时间完成操作

 

UIBackgroundTaskIdentifier backgroundTask;

 

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

 

  // tell the OS you're about to begin a background task that may need time to finish


    backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        // 如果超时这个block将被调用
        dispatch_async(dispatch_get_main_queue(), ^{
            if (backgroundTask != UIBackgroundTaskInvalid)
            {
    // do whatever needs to be done
                [application endBackgroundTask:backgroundTask];
                backgroundTask = UIBackgroundTaskInvalid;
            }
        });
    }];
 
  
    // Start the long-running task
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  
        // Do the work!
  [NSThread sleepForTimeInterval:5];
  NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
  [NSThread sleepForTimeInterval:5];
  NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);    
  [NSThread sleepForTimeInterval:5];
  NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
  // done!
    
        // call endBackgroundTask - should be executed back on
  // main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            if (backgroundTask != UIBackgroundTaskInvalid)
            {
    // if you don't call endBackgroundTask, the OS will exit your app.
                [application endBackgroundTask:backgroundTask];
                backgroundTask = UIBackgroundTaskInvalid;
            }
        });
    });

 NSLog(@"Reached the end of ApplicationDidEnterBackground - I'm done!");
 
}

 

 

四:本地消息

 

1:创建一个本地消息

 

-(IBAction) scheduleNotification {
    UILocalNotification *local = [[UILocalNotification alloc] init];
    
 // create date/time information
 local.fireDate = [NSDate dateWithTimeIntervalSinceNow:15];
    local.timeZone = [NSTimeZone defaultTimeZone];
 
 // set notification details
    local.alertBody = @"Missing you already!";
    local.alertAction = @"View";
 
 // set the badge on the app icon
    local.applicationIconBadgeNumber = 1;
 
 // Gather any custom data you need to save with the notification
    NSDictionary *customInfo = 
 [NSDictionary dictionaryWithObject:@"ABCD1234" forKey:@"yourKey"];
    local.userInfo = customInfo;
 
 // Schedule it!
    [[UIApplication sharedApplication] scheduleLocalNotification:local];
    
 [local release];

}

 

 

2:delegate 处理方法

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
 
 //程序启动是检查是否有UILocalNotification,如果有跳出提示框
// reset badge 
 application.applicationIconBadgeNumber = 0;
 
    // If the app was closed, and we launched from the notification
    UILocalNotification *local =
    [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (local) {
        UIAlertView *alert = [[UIAlertView alloc]
         initWithTitle:@"You came back! (App was closed)"
       message:@"Nice to see you again!" delegate:nil
       cancelButtonTitle:@"Okay" otherButtonTitles:nil];
  [alert show];
  [alert release];
    }

 
 return YES;
}

 

 

//如果程序完全退出,此方法不会被调用,而是先调用didFinishLaunchingWithOptions把程序启动起来。如果该程序在后台运行收到消息时直接调用该方法
- (void)application:(UIApplication *)application 
didReceiveLocalNotification:(UILocalNotification *)local {

 // reset badge number
 application.applicationIconBadgeNumber = 0; 
 
 if (local) {
  // get custom info from dictionary
  NSString *customInfo = [local.userInfo objectForKey:@"yourKey"];
  // 
        UIAlertView *alert = [[UIAlertView alloc]
         initWithTitle:@"You came back! (App was running)"
         message:customInfo delegate:nil
         cancelButtonTitle:@"Okay" otherButtonTitles:nil];
  [alert show];
  [alert release];
    }
}

 

 

 

五:后台播放音乐

 

 

1:读取文件

 

- (void)viewDidLoad {
    [super viewDidLoad];
 
 self.playPauseButton.titleLabel.text == @"play";
 
 // grab the path to the caf file
 NSString *soundFilePath =
 [[NSBundle mainBundle] pathForResource: @"Rainstorm"
         ofType: @"mp3"];
 
 NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
 
 // create a new AVAudioPlayer initialized with the URL to the file
 AVAudioPlayer *newPlayer =
 [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
             error: nil];
 [fileURL release];
 
 // set our ivar equal to the new player
 self.player = newPlayer;
 [newPlayer release];
 
 // preloads buffers, gets ready to play
 [player prepareToPlay];
 
 // set delegate so we can get called back when the sound has finished playing
 [player setDelegate: self];
 

  //重要的两行
  // set category of audio
 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
 // announce that we want to hook up to remote UI events
 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

 
}

 

 

2:重写canBecomeFirstResponder 方法,使改view 可以成为第一响应者

-(BOOL) canBecomeFirstResponder {
       return YES;
}

 

 3:显示view时,设置为第一响应者

-(void) viewDidAppear:(BOOL)animated {
       [self becomeFirstResponder];
}

 

 

4:实现remoteControlReceivedWithEvent方法使程序接收 iphone 自动音乐控制事件

 

-(void) remoteControlReceivedWithEvent:(UIEvent *)event {
 switch (event.subtype) {
       case UIEventSubtypeRemoteControlTogglePlayPause:
                [self playPause];
       default:
       break;
     }
}

 

 5:info.plist 设置,可以设置多种形式

 

 <key>UIBackgroundModes</key>
 <array>
  <string>audio</string>
 </array>

 

 

 六:NSUserDefaults  问题

 

如果程序在后台挂起,在转入到前台后不会调用viewDidLoad 方法,所以要在viewDidLoad 方法里面注册UIApplicationWillEnterForegroundNotification ,调用loadSettings

 

-(void) loadSettings: (NSNotification *) notification {
         NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
         [defaults synchronize];
  }

 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
 
 [self loadSettings:nil];
 
 NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
 [notificationCenter addObserver:self 
      selector:@selector(loadSettings:) 
      name:UIApplicationWillEnterForegroundNotification 
        object:nil];
 
    [super viewDidLoad];
}

 

 

 

七:去除后台运行inof.list

 

application dose not run in background   设置为  true

 

 

 

分享到:
评论

相关推荐

    iOS 14新特性与适配要点

    在iOS 14中,Apple引入了许多新特性,这些特性为开发者提供了更多创新和改进用户体验的机会。以下是一些关键的iOS 14新特性及Swift中的适配要点: 1. **Widget**: iOS 14引入了小部件,允许开发者创建自定义的、可...

    ios 4.3.2 4.3.2 多任务手势

    4. 将新创建的手势关联到“多任务”(Multitasking)操作,这样当执行该手势时,就会触发多任务界面。 5. 为了实际启用多任务手势,可能还需要在系统设置中进行额外的调整,例如修改General.plist文件中的相关参数。...

    开发者所需要知道的 iOS 10 SDK 新特性(苹果ios开发新特性)

    ### 开发者所需掌握的iOS 10 SDK新特性详解 #### 一、概述 自从2007年iPhone首次亮相以来,iOS的发展历程可谓是一段飞速前进的历史。每一代iOS系统的推出都伴随着一系列令人瞩目的创新和技术突破。进入iOS 10时代...

    IOS7新特性大集合Demo

    4. **多任务处理**:苹果引入了全新的多任务管理机制,允许应用在后台进行数据同步和预加载,提高了效率。用户可以在应用切换器中查看所有打开的应用并关闭不需要的。 5. **AirDrop**:iOS 7引入了AirDrop功能,...

    仿iOS9多任务切换的卡片流.zip

    在iOS系统中,多任务切换界面的设计一直备受用户喜爱,特别是iOS9引入的卡片流式切换方式,它为用户提供了直观、流畅的多任务管理体验。这个名为"仿iOS9多任务切换的卡片流"的开源项目,目标是复现这一功能,并允许...

    iOS组件与框架 iOS SDK高级特性剖析

    多线程编程是优化应用性能的关键,通过GCD(Grand Central Dispatch)或Operation Queues,开发者可以高效地处理后台任务,保证界面的流畅性。Push Notifications则允许应用在后台向用户发送消息,增加用户参与度。...

    iOS 7学习:多任务处理之Background Fetch对应的Demo

    在iOS系统中,多任务处理是一项关键特性,它允许应用程序在后台执行特定任务,从而提供更流畅、连贯的用户体验。iOS 7引入了若干多任务处理技术,其中之一就是Background Fetch,这是一种高效的方式,让应用能在系统...

    iOS12新特性之推送通知详解

    iOS12中,开发者可以添加更多的动作到通知中,让用户可以直接在通知界面执行预设的操作,比如回复邮件、标记任务完成等,而不需要打开应用。这些动作可以通过`UNNotificationAction`类进行配置,让通知变得更加实用...

    Swift 4开发iOS应用

    1. **Swift 4新特性**: - ** Codable协议**:Swift 4引入了编码解码协议,简化了JSON和Property List的数据交换。 - **类型推断**:进一步优化,减少了显式类型声明的需求。 - **泛型优化**:提升了泛型操作的...

    《iOS组件与框架——iOS SDK高级特性剖析》源码

    《iOS组件与框架——iOS SDK高级特性剖析》的源码包包含了丰富的开发示例,旨在帮助开发者深入理解iOS系统的高级特性。在这个压缩包中,你可以找到22个章节的源代码,涵盖了书中大部分内容,遗憾的是,第11章、14...

    高清彩版 RayWenderlich iOS 11 by Tutorials Learning the new iOS APIs with Swift 4

    《高清彩版 RayWenderlich iOS 11 by Tutorials Learning the new iOS APIs with Swift 4》是一本详细介绍如何使用Swift 4来学习和掌握iOS 11新特性的教程书籍。iOS 11是苹果公司在2017年发布的重要版本之一,带来了...

    iOS 4 实战 iOS 4 in Action J.Harrington+源代码

    iOS 4是苹果公司为iPhone、iPad和iPod touch设备推出的操作系统版本,它带来了许多新特性和改进,包括多任务处理、Game Center、iAd广告平台、FaceTime视频通话以及更强大的开发者工具等。这些新功能为开发者提供了...

    iOS 4 in Action.pdf

    这本书详细介绍了iOS 4的各种新特性和功能,包括多任务处理、游戏中心、本地通知、文件系统访问以及UI设计原则等。 一、多任务处理 iOS 4引入了多任务处理,让应用程序可以在后台运行,提高了用户体验。开发者可以...

    开发者所需要知道的 iOS 9 SDK 新特性 - OPEN资讯1

    iOS 9 引入了对iPad多任务处理的支持,Slide Over功能允许用户快速在应用之间切换,而Split View则允许两个应用同时并排显示,提高了生产力和多任务处理能力。这对于iPad Air 2这样的设备来说尤其重要,因为它们...

    iOS 10 新特性之通知推送--干货一篇 - 简书1

    以上是iOS 10在通知推送方面的主要新特性,它们为开发者提供了更多灵活性和创新空间,同时也提升了用户接收和互动通知的体验。通过熟练掌握这些新功能,开发者可以创建出更加个性化和高效的移动应用。

    ios5实战 byTotorials

    5. **多任务处理**:iOS 5对多任务处理进行了优化,使得应用程序在后台也能执行特定任务,如音乐播放、位置更新和下载。书中将涵盖如何利用多任务特性来增强应用的功能。 6. **其他技术**:除了上述核心特性外,书...

    实战iOS7之后台多任务 - 我期望的世界 - ITeye技术网站1

    本文将详细讲解iOS后台多任务的几个关键特性:后台任务(Background Task)、后台数据获取(Background Fetch)、静默远程通知(Silent Remote Notifications)以及NSURLSession的后台会话(BackgroundSession)。...

    iOS 8新功能示例代码

    9. **Multitasking**: 在iPad上,iOS 8引入了Slide Over和Split View多任务模式。开发者可以利用`UISplitViewController`和`UIPresentationController`来优化应用在多任务环境下的表现。 10. **WebKit**: 新的...

Global site tag (gtag.js) - Google Analytics