iOS应用推到后台继续执行
2015-07-14 16:10
639 查看
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
__block UIBackgroundTaskIdentifier _bgTask;
}
@property (nonatomic, strong) NSTimer * pushTimer;
@end
在AppDelegate.m中实现
- (void)timerMethod:(NSTimer *)paramSender
{
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIDevice * device = [UIDevice currentDevice];
if([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported])
{
self.pushTimer = [NSTimer scheduledTimerWithTimeInterval:30.0f target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];
//向iOS系统,借用10分钟(默认就是10分钟)时间。当调用beginBackgroundTaskWithExpirationHandler:
记得必须调用endBackgroundTask:方法,否则iOS会终止你的程序.
_bgTask = [application beginBackgroundTaskWithExpirationHandler:^
{
if(_bgTask != UIBackgroundTaskInvalid){
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
}];
//如果想提前结束10分钟的后台运行,可在下面加逻辑,目前是空转.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSInteger remaining = [application backgroundTimeRemaining];
while (remaining > 30 && _bgTask != UIBackgroundTaskInvalid) {
sleep(15);
remaining = [application backgroundTimeRemaining];
DLog(@"remain %d S", remaining);//iOS 7就只有180秒,但是超过这个时间程序依然可以运行
}
});
}
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
DLog(@"程序即将进入【前台】");
if(_bgTask != UIBackgroundTaskInvalid){
if(_pushTimer!=nil){
[_pushTimer invalidate];
}
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
}
__block UIBackgroundTaskIdentifier _bgTask;
}
@property (nonatomic, strong) NSTimer * pushTimer;
@end
在AppDelegate.m中实现
- (void)timerMethod:(NSTimer *)paramSender
{
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIDevice * device = [UIDevice currentDevice];
if([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported])
{
self.pushTimer = [NSTimer scheduledTimerWithTimeInterval:30.0f target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];
//向iOS系统,借用10分钟(默认就是10分钟)时间。当调用beginBackgroundTaskWithExpirationHandler:
记得必须调用endBackgroundTask:方法,否则iOS会终止你的程序.
_bgTask = [application beginBackgroundTaskWithExpirationHandler:^
{
if(_bgTask != UIBackgroundTaskInvalid){
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
}];
//如果想提前结束10分钟的后台运行,可在下面加逻辑,目前是空转.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSInteger remaining = [application backgroundTimeRemaining];
while (remaining > 30 && _bgTask != UIBackgroundTaskInvalid) {
sleep(15);
remaining = [application backgroundTimeRemaining];
DLog(@"remain %d S", remaining);//iOS 7就只有180秒,但是超过这个时间程序依然可以运行
}
});
}
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
DLog(@"程序即将进入【前台】");
if(_bgTask != UIBackgroundTaskInvalid){
if(_pushTimer!=nil){
[_pushTimer invalidate];
}
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
}
相关文章推荐
- [Android]在代码里运行另一个程序的方法
- 如何隐藏程序的运行
- win运行字符命令
- PowerShell实现动态获取当前脚本运行时消耗的内存
- 在Linux上运行C#的方法
- C#隐式运行CMD命令(隐藏命令窗口)
- nodejs教程之环境安装及运行
- 查看 MySQL 已经运行多长时间的方法
- android的编译和运行过程深入分析
- C#判断程序是否是管理员权限运行的方法代码示例
- 在命令行下运行PHP脚本[带参数]的方法
- js网页中的(运行代码)功能实现思路
- Android中设置只有程序第一次运行才显示的界面实现思路
- php强制运行广告的方法
- 透过ashx看浏览器服务器运行本质(图解)
- Powershell实现编写和运行脚本
- C#确保只有一个实例在运行的方法
- Android Studio使用教程(二):基本设置与运行
- 提高C++程序运行效率的10个简单方法
- 一次编写,随处运行