我需要每 10 分钟计划一次计划任务。
由于在 Lollipop 和更高版本中 setRepeating() 不准确,我使用 setExact() 并且(在触发警报时)我在 10 分钟内设置了新的准确警报。
private void setAlarm(long triggerTime, PendingIntent pendingIntent) {
int ALARM_TYPE = AlarmManager.ELAPSED_REALTIME_WAKEUP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(ALARM_TYPE, triggerTime, pendingIntent);
} else {
alarmManager.set(ALARM_TYPE, triggerTime, pendingIntent);
}
}
triggerTime是计算出来的SystemClock.elapsedRealtime() + 600_000;
当警报响起时,我首先计划一个新的,然后才运行我计划的任务。
setAlarm();
mySheduledTask;
我的 list 中确实有 WAKE_LOCK 权限。
当我在 Android 4 上进行测试时,它运行良好(偏差可能是 12-15 毫秒)。
但是当我在小米红米 Note 3 Pro (5.1.1) 上运行应用程序时 - 偏差可能高达 15 秒!
例如,我在日志文件中看到:第一次运行是在 1467119934477(RTC 时间),第二次运行是在 1467120541683。差异是 607_206 毫秒,而不是 600_000 ,正如它所计划的那样!
我错过了什么?什么是模拟系统警报行为的方法(这是可以描述我的策略的最接近的用例)?
PS. 我将 IntentService 用于 PendingIntent = PendingIntent.getService(context, 0, myIntent, 0);
最佳答案
操作系统会根据您指定的时间来选择警报的工作方式。因此,当手机进入“半 sleep ”模式时,它不需要在您希望的时间使用资源。基本上,它会等待操作系统为其打开的“窗口”,然后才会运行您要运行的警报,这就是您遇到时间间隔的原因。
这是在 Marshmallow OS 上引入的,并将继续在 Nougat OS 上继续,作为 Google 尝试改进设备电池的一部分。
事情是这样的,你有两个选择:
JobScheduler,这样可以节省电池电量)。 setExactAndAllowWhileIdle这可能会导致您的电池问题(请谨慎使用,过多的警报对您的电池不利)。
此方法不会重复,因此您必须声明要在 pendingIntent 打开的服务上运行的下一个作业。如果您选择选项 2,请从这里开始:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
int ALARM_TYPE = AlarmManager.RTC_WAKEUP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
am.setExactAndAllowWhileIdle(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
am.setExact(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
else
am.set(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
关于Android AlarmManager setExact() 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38094420/
我试图操纵元素的位置,所以在某些页面滚动位置之间,他的css发生了变化。看看这个简单的例子:http://jsfiddle.net/6RtTX/8/问题是-$(window).scroll不是那么准确,所以如果我滚动得非常快,它就会变得非常困惑。这个问题有解决办法吗?我可以在$(window).scroll方法中对这些操作进行排队吗?提前致谢。 最佳答案 试着像这样改变你的fiddle的代码:$(window).scroll(function(event){if(event.pageY>100&&event.pageY通过使用传递的
我遇到了一个奇怪的问题。我用以下方法捕捉鼠标移动:varmmoves=[];jQuery(document).mousemove(function(event){mmoves.push({x:event.pageX,y:event.pageY})}然后我将一个div附加到页面,如:$("body").append('*');然后尝试回放Action它在大多数页面上工作正常,但在某些页面上播放开始(“*”初始位置)右侧(x)的一些像素。y没问题,但x向右大约120px。在其他页面上它是准确的。在不准确的页面上,当鼠标靠近右侧滚动条时,它会超出右侧页面边框并产生水平滚动条。我认为这与正在播
这是一个有点详细的问题,所以让我先解释一下情况,然后是我的实现,最后是问题,以便您最好地理解。截至4月4日,添加了更新并将问题缩小到一个待处理的问题,有关最新信息,请参阅此问题的底部。TLDR;我有一条从GoogleMapsDirectionsAPI返回的长路线,并且想要该路线的高程图。太糟糕了,它不起作用,因为它是通过GET请求的,并且URL最大长度为2.048个字符,超出了。我拆分了请求;使用Promises保证正确的处理顺序;但海拔数据并不总是完整的完整路线,并不总是以正确的顺序显示,并不总是遵循给定的路径,有时高程间的位置跨越几公里。介绍;尝试为GoogleMapsDirect
我一直在做一个项目,我必须将字符串转换为uint,以确保一些货币值匹配:total,err:=strconv.ParseFloat(paymentResp.Transactions[0].Amount.Total,64)iferr!=nil{returnctx.JSON(http.StatusBadRequest,err.Error())}ifo.TotalPrice!=uint(total*100){returnctx.JSON(http.StatusBadRequest,"Unabletoverifyamountpaid")}但是当我尝试对几个数字执行strconv.ParseFl
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我有一个创建新计时器的类,并在每次计时时轮询远程队列(通过HTTP)。publicvoidStart(){_timer=newTimer((x)=>{Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.fff")+""+typeof(T).Name);varmessage=(Message)null;varm
对于下面的代码:实际间隔始终是1014.01毫秒而不是1000毫秒...我也尝试过在C++中使用System.Windows.Forms.Timer、System.Threading.Timer和WinAPISleep(int)函数,但额外增加的14.01ms始终存在。Windows8的系统时钟是准确的,但.NET计时器和WindowsAPI的Sleep(int)函数都不准确。publicpartialclassForm1:Form{privatelongticks;publicForm1(){InitializeComponent();}privatevoidForm1_Load(o
在此测试机中,tcp/80正在监听,而tcp/4444未监听。(我已经用netstat-an验证了这一点)如果我简单地将args.ip值传递给ip,并将其转发给scan()函数,扫描结果总是准确的.ip=args.ip正常输出:C:\>pythonscript.py127.0.0.1Portnumber:80Connectingto127.0.0.1:80OK127.0.0.1:80C:\>pythonscript.py127.0.0.1Portnumber:4444Connectingto127.0.0.1:4444FAIL127.0.0.1:4444C:\>但是,当我尝试使用以下函
我编写了一个程序,它通过Parallel.ForEach使用所有可用的核心。ForEach的列表包含约1000个对象,每个对象的计算需要一些时间(约10秒)。在这种情况下,我设置了一个这样的计时器:timer=newSystem.Timers.Timer();timer.Elapsed+=TimerHandler;timer.Interval=15000;timer.Enabled=true;privatevoidTimerHandler(objectsource,ElapsedEventArgse){Console.WriteLine(DateTime.Now+":Timerfire
Javascript数学三Angular函数返回错误结果。尝试alert(Math.sin(Math.PI));它不返回0。也许问题出在javascript十进制数精度上。是否有任何解决方法来获得正确的结果? 最佳答案 不过,它非常非常接近于零。(~10^-16)alert(Math.sin(Math.PI/2))确实返回1。这只是您在处理浮点运算时必须注意的事情之一。到处都会出现舍入错误。 关于JavascriptMath.cos和Math.sin不准确。有什么解决办法吗?,我们在St
我有这个代码:$expiration_date='2041-07-14'$epoch_timestamp_expiration_date=strtotime($expiration_date);//Get7days$seven_days_ago=7*86400;//subtractsevendaysfromtheexpirationdate.$epoch_timestamp_expiration_date-=$seven_days_ago;//Formatthenewexpirationdate-7daysago$formatted_epoch_time=date('Y-m-d',$e