IOS在后台每隔一段时间执行一下

步骤:

1.在info.plist里加入UIBackgroundModes键,其值为数组,数组之一为voip字符串:

<key>UIBackgroundModes</key><array><string>voip</string></array>

2.在程序启动的时候调用- (void)setupBackgroundHandler函数,函数体如下:

#pragma mark - VoIP

- (void)setupBackgroundHandler

{   

    if( UIUDeviceIsBackgroundSupported() )

  

        if(

           [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler: ^

            {

                [self requestServerHowManyUnreadMessages];

            }

            ]

           )

        {

            UDLog(@"Set Background handler successed!");

        }

        else

        {//failed

            UDLog(@"Set Background handler failed!");

        }

    }

    else

    {

        UDLog(@"This Deviece is not Background supported.");

    }

}

- (void)requestServerHowManyUnreadMessages

{

    UIApplication* app = [UIApplication sharedApplication];

    

    if([app applicationState] == UIApplicationStateBackground)

    {

        NSArray * oldNotifications = [app scheduledLocalNotifications];

        if ([oldNotifications count] > 0)

            [app cancelAllLocalNotifications];

        UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];

        if (alarm)

        {

            alarm.fireDate = [NSDate dateWithTimeIntervalSinceNow:15];

            alarm.timeZone = [NSTimeZone defaultTimeZone];

            alarm.repeatInterval = 0;

            alarm.soundName = UILocalNotificationDefaultSoundName;

            alarm.alertBody = @"Time to request MOA2 Server!";

            [app scheduleLocalNotification:alarm];

        }

    }

    else if([app applicationState] == UIApplicationStateActive)

    {

        UIAlertView *alertView =  [[[UIAlertView alloc] init] autorelease];

        [alertView setTitle:@"alert"];

        [alertView setMessage:@"Time to request MOA2 Server!"];

        [alertView addButtonWithTitle:NSLocalizedString(@"cancel", nil)];

        [alertView setDelegate:nil];

        [alertView show];

    }

}



解说:

- (BOOL)setKeepAliveTimeout:(NSTimeInterval)timeout handler:(void (^)(void))keepAliveHandler

函数功能:app每隔timeout唤醒一次。

0.要成功调用该函数,就必须在Info.plist里设UIBackgroundModes键的array值之一voip字符串.

1.timeout必须>=600

2.唤醒app的时间间隔是不精准的。

3.唤醒后只有10秒执行时间。即handler里的代码要在10秒类执行完。10秒后app再次被阻塞。

(可以用-backgroundTimeRemaining属性来返回剩余时间)

4.该函数成功调用后,在程序生命周期内有效。

该函数的效果在回到前台的状况下,依然有效。(因此可以把它当timer使.)

5.clearKeepAliveTimeout函数用来清除handler。

时间: 2024-08-22 19:56:35

IOS在后台每隔一段时间执行一下的相关文章

c#实现每隔一段时间执行代码(多线程)

总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用System.Threading.Timer: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

delphi中我用定时器每隔一段时间执行操作

delphi中,我用定时器每隔一段时间执行数据库插入及更新工作!adoquery.close;adoquery.sql.cleare;adoquery.connection:=con1;adoquery.sql.add('exec addery');execsql;上面的基本语句!我的问题是:定时器执行时,在软件界面就会很卡,无法操作!请问是不是需要创建一个线程才能处理卡的问题呢?请大神们帮帮忙!非常感谢!如果是需要写线程,更希望能把线程也写出来!非常感谢! unit Unit1; interf

每隔一段时间执行命令bat脚本

@echo start :start adb shell dumpsys meminfo com.xxx.gallery ping 127.1 -n 2 >null goto start ping命令-n表示间隔时间,秒为单位,-w表示执行次数

js每隔一段时间执行函数

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> </body> <script type="application/javascript"> setInterval(function(){ console.log(new Date

隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat

此处是转载的  是给自己做的备注 问题:隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat 原因查找:由于tomcat自身log中并无错误产生,磁盘空间足够,读写也正常,排除其他原因后怀疑是jvm崩溃导致,于是查gc日志:从上图可以看出每次full GC是老年代内存占用量相当小,远没有达到它的最大值,持久代也一样,而且每次GC过后,占用量基本没有变化,也就是说,每一次full GC都是在做无用功,白白浪费掉了一大批性能.从内存占用率方面看不是内存分配不够,应该是程

setTimeout() 实现程序每隔一段时间自动执行

定义和用法 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 语法 setTimeout(code,millisec) 参数 描述 code 必需.要调用的函数后要执行的 JavaScript 代码串. millisec 必需.在执行代码前需等待的毫秒数. 提示和注释 提示:setTimeout() 只执行 code 一次.如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout(). [示例] //每5秒使用Ajax取一次

storm每隔一段时间发送tuple

TickTuple可以满足每隔一段时间发送tuple,"__system" component会定时往task发送 "__tick" stream的tuple, 发送频率由TOPOLOGY_TICK_TUPLE_FREQ_SECS来配置, 可以在default.ymal里面配置, 也可以在代码里面通过getComponentConfiguration()来进行配置. 代码里面配置如下 public Map<String, Object> getCompo

可以每隔一段时间自动运行的一个批处理

可以每隔一段时间自动运行的一个批处理  zidong.bat代码 @echo off :Begin Start "d:\print.bat" rem 下面这行是延时代码,300是秒做单位的,300秒就是5分钟,需要多长时间自改一下 @Ping 127.0.0.1 -n 300 Goto Begin 执行后有个问题是每次关不掉print.bat print.bat代码 net session /delete /y 问题有待解决

实现每次触发事件后隔一段时间后才能再次触发事件

比如: 每次点击“提交”按钮后隔3s后才能再次提交. 可以这样:点击后设置按钮不可用,并在3s后再设置按钮可用 $('#button1').click(function(){ //在这里提交或做别的事 $(this).attr("disabled",true); setTimeout("$('#button1').attr('disabled',false);", 3000); //此处setTimeout里面不能用$(this),this指的是window对象 }