所以我正在尝试让一些意图为我工作,
并且在2个特定意图上遇到问题。我搜查了这些小组
和网络似乎找不到比什么更多的信息
文档给了我。
如果我在声明中使用这些意图似乎并不重要
显示,或者如果我尝试在代码中注册接收器,我的接收器
永远不会收到ACTION_TIME_CHANGED
或ACTION_DATE_CHANGED
的行动
"Settings" --> "Date & Time"
。
据我所知,我应该接受这些行动
每当用户明确设置时间/日期时广播接收器
转到{{1}}然后修改时间或
日期
我错误地解释了这些行为的用途吗?
是否有任何我需要声明的权限才能接收
这些行动?
是否有人采取过这种行动?
是否有一些使用此操作的有用示例,我找不到任何有用的内容,有大量的格式更改示例,但实际的time_date更改没有......
提前致谢
答案 0 :(得分:5)
除了<intent-filter>
之外,请参阅Android ACTION_DATE_CHANGED broadcast有关AOSP错误:ACTION_TIME_CHANGED
应在时钟设置时触发,ACTION_DATE_CHANGED
应在时钟结束时触发第二天,但是如果时钟倒退,ACTION_DATE_CHANGED
将不再发射,直到时钟赶上第二天的时间。
答案 1 :(得分:2)
Intent.ACTION_DATE_CHANGED
和Intent.ACTION_TIME_CHANGE
D仅在用户手动更改时间或日期时触发,并且系统不会自动触发它们。
我担心你必须使用Intent.ACTION_TIME_TICK
,这是由系统每分钟触发的。
答案 2 :(得分:1)
是的,你必须添加
<intent-filter>
<action android:name="android.intent.action.DATE_CHANGED"></action>
</intent-filter>
答案 3 :(得分:0)
在你的广播接收器onReceive方法中我假设你有类似以下的设置?
@Override
public void onReceive(Context context, Intent intent){
final String action = intent.getAction();
if (Intent.ACTION_DATE_CHANGED.equals(action) || Intent.ACTION_TIME_CHANGED.equals(action)){
// do stuff here
}
...
}
另一个考虑因素是你是否为你的IntentFilter添加了适当的过滤器,例如......
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_DATE_CHANGED);
答案 4 :(得分:0)
我用来在日期改变时采取行动的另一种方法。
实际上,Intent.ACTION_DATE_CHANGED仅适用于高级日期的日期,而不适用于手动更改手机上日期的上一个日期。此外,当您将时间设置为11:59并等待它变为00:00以向您提供日期更改的广播事件时,它不会为您提供触发器。
所以,我最终制定了自己的逻辑,在共享的pref中存储日期,然后检查当前日期是在之前或之前存储的日期之前(有一些日期处理逻辑),并根据它更新我的数据。
private void takesomeActionIfDateIsChanged() {
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
long currentDateTimeInMillis = System.currentTimeMillis();
Date currentDateWithMillis = new Date(currentDateTimeInMillis);
String formattedCurrentDateWithOnlyDMYStr = dateFormat.format(currentDateWithMillis);
Log.d(TAG, "formattedCurrentDate With Only DateMonthAndYear String : " + formattedCurrentDateWithOnlyDMYStr);
Date formattedCurrentDate = dateFormat.parse(formattedCurrentDateWithOnlyDMYStr);
String storedDateStr = mSpManager.getStoredDate(SPManager.STORED_DATE);
Log.d(TAG, "storedDateStr : " + storedDateStr);
Date storedDateOnlyWithDateMonthAndYear = dateFormat.parse(storedDateStr);
if (formattedCurrentDate.after(storedDateOnlyWithDateMonthAndYear)) {
Log.d(TAG, "The current date is after stored date");
mSpManager.putNewDate(SPManager.STORED_DATE, formattedCurrentDateWithOnlyDMYStr);
mCounter = 0;
} else if (formattedCurrentDate.before(storedDateOnlyWithDateMonthAndYear)) {
Log.d(TAG, "The current date is before stored date");
mSpManager.putNewDate(SPManager.STORED_DATE, formattedCurrentDateWithOnlyDMYStr);
mCounter = 0;
} else {
Log.d(TAG, "The current date is same as stored date");
}
} catch (Exception e) {
Log.e(TAG, "exception : ", e);
}
}
答案 5 :(得分:0)
您不需要任何许可。
要获得日期更改通知,您需要使用这些操作(以及ACTION_TIMEZONE_CHANGED
)注册 BroadcastReceiver 。
这是我做出的解决方案: