我有一项服务,定期做一些工作。我不确定这是否是一个很好的练习但我正在设置一个警报并呼叫服务本身。我正在研究android 4.4.2,到目前为止我无法在预期的时间内工作。例如,如果我将闹钟设置为1分钟,则可以在5或10分钟后运行。我可以忽略几秒钟的延迟,但9分钟的延迟很难接受。
这是我的代码
Intent myIntent = new Intent(TimerService.this, this.getClass());
pendingIntent = PendingIntent.getService(TimerService.this, 101,
myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + onTime,1000, pendingIntent);
我也尝试过alarmManager.set()和setExact()但结果仍然相同。
代码有什么问题,或者我在调用服务本身时出错了吗?
答案 0 :(得分:0)
文档说将targetSDK设置为低于19将为您提供准确的时间。
这听起来像setExact应该给你你想要的时间(我知道你说它不起作用:))。
我使用这样的东西,它总是在要求的时间内约30秒内开始。
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + DEFAULT_INITIAL_RUN,
DEFAULT_RUN_INTERVAL, pi);
If your interval is that short have you considered using handler.postDelayed to kick off
your periodic code?
以下是来自AlarmManager设置方法的文档。
注意:从API 19开始,传递给此方法的触发时间被视为不精确:警报将不会在此时间之前传递,但可能会延迟并在稍后传递。操作系统将使用此策略在整个系统中将警报“批处理”在一起,从而最大限度地减少设备需要“唤醒”并最大限度地减少电池使用的次数。一般而言,只要将来安排的警报很长,就不会推迟在不久的将来安排的警报。
使用新的批处理政策,交付订单保证不像以前那么强大。如果应用程序设置了多个警报,则这些警报的实际交付顺序可能与其请求的交付时间的顺序不匹配。如果您的应用程序具有强大的订购要求,则可以使用其他API来获取必要的行为;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。
targetSdkVersion在API 19之前的应用程序将继续获得之前的警报行为:所有计划的警报都将被视为准确。
答案 1 :(得分:0)
我做了很多研究。通常,setExact适用于我测试的设备(LG),除了一些三星设备(S4,Note)。在Samsungs上我使用了JobScheduler:http://code.tutsplus.com/tutorials/using-the-jobscheduler-api-on-android-lollipop--cms-23562
在21之后,所有使用API的设备都能保持一致。我测试了30秒的定期运行。
Eidit:它不能始终如一地运作。它徘徊,2分钟开火。但是有效的是,每隔15秒就会设置一次。我的解决方案是,每隔15秒触发一次警报,然后什么也不做,设置另一次迭代,如果还不是我想要的话,就回去睡觉。