ACTION_TIME_CHANGED或ACTION_DATE_CHANGED,无法使它们正常工作

时间:2011-10-27 07:32:18

标签: android datetime date time

所以我正在尝试让一些意图为我工作, 并且在2个特定意图上遇到问题。我搜查了这些小组 和网络似乎找不到比什么更多的信息 文档给了我。 如果我在声明中使用这些意图似乎并不重要 显示,或者如果我尝试在代码中注册接收器,我的接收器 永远不会收到ACTION_TIME_CHANGEDACTION_DATE_CHANGED的行动 "Settings" --> "Date & Time"。 据我所知,我应该接受这些行动 每当用户明确设置时间/日期时广播接收器 转到{{1}}然后修改时间或 日期 我错误地解释了这些行为的用途吗? 是否有任何我需要声明的权限才能接收 这些行动? 是否有人采取过这种行动?

是否有一些使用此操作的有用示例,我找不到任何有用的内容,有大量的格式更改示例,但实际的time_date更改没有......

提前致谢

6 个答案:

答案 0 :(得分:5)

除了<intent-filter>之外,请参阅Android ACTION_DATE_CHANGED broadcast有关AOSP错误:ACTION_TIME_CHANGED应在时钟设置时触发,ACTION_DATE_CHANGED应在时钟结束时触发第二天,但是如果时钟倒退,ACTION_DATE_CHANGED将不再发射,直到时钟赶上第二天的时间。

答案 1 :(得分:2)

Intent.ACTION_DATE_CHANGEDIntent.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

这是我做出的解决方案:

https://stackoverflow.com/a/48782963/878126