在Android中,闹钟管理器无法在精确时间触发闹钟

5
我使用Calendar类如下设置了闹钟:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,1);
cal.getTimeInMillis();  
cal.set(Calendar.MINUTE,05);
long TriggerMillis = cal.getTimeInMillis();

AlarmManager aManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);      
aManager.set(AlarmManager.RTC_WAKEUP, TriggerMillis,pIntent);

在闹钟触发时继续进行的待定意图为pIntent。

事件会有几秒钟的延迟。使用Calendar类来执行此任务是否有问题?有什么建议吗?

TIA..


pIntent是什么?它是用于BroadcastReceiverPendingIntent吗? - CommonsWare
1
你的目标 API 等级是 19 吗?如果是,那么这是设计上的问题。闹钟时间不会精确。 - Phantômaxx
@CommonsWare 的 pIntent 是一个用于启动服务的 pendingIntent。 - Audhil
@Tobor 是的,我正在针对API级别19进行开发。有没有其他方法来解决这个问题? - Audhil
2个回答

11
你有两个问题:
  1. 直接使用_WAKEUP闹钟与服务不可靠。唯一可靠的模式涉及到WakefulBroadcastReceiver、我的WakefulIntentService或类似的东西,其中PendingIntent将会是一个BroadcastReceiver

  2. 如果你的android:targetSdkVersion是19或更高,并且你正在运行API Level 19+设备上,则set()是不精确的。理想情况下,你可以允许它是不精确的,或者使用setWindow()来控制它的偏差大小,以最小化你的闹钟事件对电量的影响。如果它绝对必须在精确的时刻发生,你将需要使用setExact()。由于setWindow()setExact()是API Level 19中新增的,你将需要通过检查Build.VERSION.SDK_INT进行相应的分支,在旧设备上回退到set()


能否在API 19+上精确安排重复的未来任务?当应用程序未在后台运行且设备处于空闲状态时,我遇到了问题。谢谢。 - Manmohan Badaya
3
@Manmohan: дёҚе®Ңе…ЁжҳҜиҝҷж ·гҖӮ жңҖжҺҘиҝ‘зҡ„ж–№жі•жҳҜдҪҝз”ЁsetExact()并"йҮҚеӨҚ"иҮӘе·ұпјҲйҖҡиҝҮеңЁж—©жңҹзҡ„setExact()и°ғз”ЁдёӯеҶҚж¬Ўи°ғз”ЁsetExact()пјүгҖӮ 然иҖҢпјҢеңЁAndroid 6.0+дёҠпјҢеҚідҪҝдҪҝз”ЁsetExactAndAllowWhileIdle()пјҢиҝҷд№ҹдёҚжҳҜйқһеёёзІҫзЎ®зҡ„гҖӮ - CommonsWare

2

我认为你应该使用这个函数

setExactAndAllowWhileIdle

例如:

AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + 100, pendingIntent); // +100 is to set nearly to the current time

你需要知道这不是一个重复的闹钟,所以在你的BroadcastReceiver结束时,你应该设置下一个闹钟。
问候

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接