我有Nexus S,并且当我在手机上手动更改日期时,ACTION_DATE_CHANGED并不总是播放。如果我将日期从2014年2月13日更改为2014年2月14日,则我尚未获得ACTION_DATE_CHANGED的支持,但如果将其设置为未来几年,有时会触发。
我可以(99%)向您保证,我不会滥用IntentFilters,BroadcastReceivers等。我很好奇为什么此广播的记录如此糟糕。通过SO和Google进行的快速扫描显示,人们不确定用户手动更改日期还是每天凌晨12:00滚动日期还是两者同时发生。我的经验表明,这与用户更改非常不一致,而且我还没有尝试过系统更改。
我将遍历AOSP代码,并隔离触发它的所有点并进行报告。
编辑:问题:任何人都知道这是怎么回事吗?:-)
这是来自frameworks / base / services / java / android / server / AlarmManagerService.java中的4.0.3_r1的代码。
首先,我们创建一个PendingIntent mDateChangeSender;
private final PendingIntent mDateChangeSender;
然后,在AlarmManagerService.java的构造函数中,我们设置PendingIntent:
Intent intent = new Intent(Intent.ACTION_DATE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
mDateChangeSender = PendingIntent.getBroadcast(context, 0, intent, 0);
然后在构造函数中:
mClockReceiver.scheduleDateChangedEvent();
那么什么是mClockReceiver?只是一个广播接收器正在监听Intent.ACTION_TIME_TICK和Intent.ACTION_DATE_CHANGED。在它的onReceive()中:
...
else if (intent.getAction().equals(Intent.ACTION_DATE_CHANGED)) {
...
scheduleDateChangedEvent();
}
然后,稍后我们找到方法scheduleDateChangedEvent():
public void scheduleDateChangedEvent() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.DAY_OF_MONTH, 1);
set(AlarmManager.RTC, calendar.getTimeInMillis(), mDateChangeSender);
}
因此,它设置了一次警报,从当前时间开始,然后将小时/分钟/秒/毫秒设置为零,然后添加一天,因此,如果今天是下午1:30,则下次将被触发在10小时30分钟内。
这并不是说这里没有bug或其他东西,但是类似ACTION_DATE_CHANGED这样的外观应该每天在午夜触发。
现在-如果我要更改手机上的日期,可以说是未来10年。处理时间变化的代码将触发第一个ACTION_DATE_CHANGED事件,然后安排新的ACTION_DATE_CHANGED被触发,时间为10年+一天的某个时间。然后,如果我们将日期改回10年(正确的日期),则仍将按10年触发警报,因此ACTION_DATE_CHANGED将不再被触发(除非您将日期设置为从现在起超过10年-尝试一下! )。
tl; dr:这是Android中的错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句