IOS 4.0은 백그라운드 실행 지원
task completion을 사용하여 비교적 중요하지만 장시간 실행되는 프로그램이 사용자가 백엔드에 들어와서 갑자기 닫히지 않도록 보장할 수 있습니다.예를 들어, 사용자의 정보를 디스켓에 저장하거나 인터넷에서 중요한 파일을 다운로드할 수 있다.이런 작업을 초기화하는 두 가지 방법이 있다. 첫째, 장시간 운행하는 중요한 임무를 BeginBackgroundTaskWithExpirationHandler:과endBackgroundTask:포장으로 한다.이렇게 하면 프로그램이 갑자기 백엔드에 들어갈 때 이 임무들이 중단되지 않도록 보호한다.2. 응용 프로그램이 응용 프로그램didEnterBackground에 의뢰할 때 방법이 호출되었을 때 다시 시작하는 두 가지 방법은 일일이 대응해야 한다.endBackgroundTask: 방법은 시스템 작업이 완료되었음을 알려주고 프로그램은 이 때 종료될 수 있다.프로그램이 백엔드 작업을 수행할 시간이 제한되어 있기 때문에, 시간이 초과되거나 시스템이 프로그램을 종료하기 전에 이 방법을 호출해야 합니다.종료를 피하기 위해서, 작업이 시작될 때 expiration handler와endBackgroundTask: 방법을 제공할 수 있습니다.(backgroundTimeRemaining 속성을 보고 얼마나 남았는지 확인할 수 있습니다).한 프로그램이 여러 개의 작업을 동시에 제공할 수 있습니다. 작업을 시작할 때마다beginBackgroundTaskWithExpirationHandler: 방법은 유일무이한handler로 돌아가서 이 작업을 식별합니다.이 작업을 종료하려면 endBackgroundTask: 방법에서 같은handler를 전달해야 합니다.
백그라운드에서 실행되는 처리 코드는 - (void) 응용 프로그램 Will Resign Active: (UIAPplication *) 응용 프로그램 또는 - (void) 응용 프로그램 Did EnterBackground: (UIAPplication *) 응용 프로그램에 놓을 수 있습니다. 물론 프로그램이 다시 활성화될 때 timer invalidate를 제거해야 합니다.
- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
// if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
NSLog(@"Supported background:%@", [UIDevice currentDevice].multitaskingSupported ? @"YES" : @"NO");
UIApplication *app = [UIApplication sharedApplication];
NSLog(@"Remaining time is:%f", app.backgroundTimeRemaining);
__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid) {
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 20; i++) {
UILocalNotification *notification=[[UILocalNotification alloc] init];
if (notification!=nil) {
NSDate *now = [NSDate new];
notification.fireDate = [now dateByAddingTimeInterval:(60 * (i + 1))];//*
notification.repeatInterval = 0;// ,kCFCalendarUnitWeekday
notification.timeZone = [NSTimeZone defaultTimeZone];
notification.applicationIconBadgeNumber = 1; //
notification.soundName= UILocalNotificationDefaultSoundName;// , alarm.soundName = @"myMusic.caf"
// 2
notification.alertBody = [NSString stringWithFormat:@"Time passed:%d minutes", (i + 1)];//
notification.alertAction = @"Open"; //
//notification.hasAction = NO; // , no alertAction
// NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
//notification.userInfo = infoDict; //
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
[notification release];
}
NSTimer *testTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(doSomeTest) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:testTimer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid) {
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
});
}
- (void)doSomeTest
{
NSLog(@"background test...");
}
참조:http://li-bonan.blog.163.com/blog/static/1355647702012871309846/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.