1

我的 Android 应用程序中有一些东西需要每天更新一次。

我认为这很简单,但我不知道我需要什么格式来格式化日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是在上午 00:01 到 23 之间:用户当地时间下午 59 点)。如果今天已经完成更新,则不应进行更新。

这就是我知道该怎么做:

  • 将上次更新日期保存在 SharedPreferences 中(但我如何获取它的字符串,我不知道)
  • 从 SharedPreferences 获取东西(但我不知道如何比较字符串格式的日期)
4

5 回答 5

9

这与您选择的格式无关。这只是重新计算的问题。

我建议使用自纪元以来的毫秒数,因为所有系统调用都使用它,因此您使用它会更容易。

由于 1000 毫秒是 1 秒,因此很容易算出1000*60*60*24等于一天(24 小时)。因此,如果storedMillis大于NOW - 1000*60*60*24,(并且NOW是 ie System.currentTimeMillis()),那么现在进行检查还为时过早。如果storedMillis较小,则保存您的NOW时间戳并进行检查:

long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if( diffMillis >= (3600000  * 24) ) {
  // store now (i.e. in shared prefs)

  // do the check
} else {
   // too early
}

编辑

我有兴趣在当天首次打开应用程序时执行此操作,即使最后一次更新是在 10 分钟前完成的。

这只是如何获得合适的毫来比较的问题。long now = System.currentTimeMillis();用以下代码块替换上面的代码:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

long now = cal.getTimeInMillis();

这应该可以解决问题。

于 2012-11-22T14:44:13.773 回答
2

如果您以 20121122 (YYYYmmdd) 格式存储日期,那么您可以比较 20121122 > 20121123。但在比较时必须将其存储为 int 或强制转换为 int。

于 2012-11-22T14:40:24.053 回答
1

存储上次执行的时间戳 (System.currentTimeMillis() ) 并将其与当前执行进行比较。如果差值超过 24 小时……你知道吗?

于 2012-11-22T14:42:41.423 回答
1

使用每 24 小时执行一次的 AlarmManager 设置警报,然后执行操作

检查这个问题:警报管理器示例

这是一种比其他方法更复杂的方法,但可以确保事情已经完成,而使用其他选项时,必须执行应用程序以检查它是否需要更新任何内容。

于 2012-11-22T14:45:30.103 回答
1

这是方法

public boolean runOnceADay() {
    SharedPreferences shp= c.getSharedPreferences(Constants.GENERAL_SHP, MODE_PRIVATE);
    SharedPreferences.Editor editor= shp.edit();
    long lastCheckedMillis = shp.getLong(Constants.ONCE_A_DAY, 0); // "KEY" you may change yhe value
    long now = System.currentTimeMillis();
    long diffMillis = now - lastCheckedMillis;
    if (diffMillis >= (3600000 * 24)) { // set up your time circulation
         editor.putLong(Constants.ONCE_A_DAY, now);
        editor.commit();
        Util.showMessage(c, "Once a Day Test");
        return false;
     } else {
        Util.showMessage(c, "Too Early");
        return true;
    }
}
于 2018-10-31T11:58:16.730 回答